2016-11-21 90 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後