2016-11-21 91 views
0

下面是一些简单的代码;请注意,有printf声明之前有一个致电waitFor()。为什么程序停止三秒钟,然后然后打印该消息?Printf不按程序顺序执行

int main(int argc, char* argv) 
{ 
    producer(); 

    return 0; 
} 

void waitFor(unsigned int secs) { 
    unsigned int retTime = time(0) + secs; // Get finishing time. 
    while (time(0) < retTime);    // Loop until it arrives. 
} 

static void *producer() 
{ 
    int s = 3; 
    printf("Busy for %d seconds", s); 
    waitFor(s); 
    return NULL; 
} 

回答

1

很可能是因为在旋转等待CPU之前,您没有让输出刷新。

您的等待例程并不是真正做到这一点的正确方法。看看使用sleep()

在我的Mac上,如果我在消息中添加换行符,它会立即输出而不需要刷新。

printf("Busy for %d seconds\n", s); 
+0

谢谢你,吉姆。因为这个答案,我使用了'waitFor'例程http://stackoverflow.com/questions/3930363/implement-time-delay-in-c/3930477#3930477 – 8protons

+1

吉姆鲍德温,是否有C系统在睡眠冲洗( )电话? AFAIK,至少libc/gcc和MSVC只在满缓冲区或显式调用时刷新。对于他们来说,忙碌循环或睡眠()将不起作用。 – theamk

+0

奇怪。在等待期间让CPU(并让其他线程运行)更好,这就是睡眠的作用。这个waitFor()正在打击将调用资源的time()调用。仅供参考:https://linux.die.net/man/3/sleep –

1

你是如何运行这个程序的?有时printf()的输出会被缓冲,并且只有在打印大量数据或程序退出时才会显示。两种简单的方法来解决这个问题是:

  • 使用标准错误:printf( - 使用后>fprintf(stderr,
  • 冲洗:致电fflush(stdout)的printf后