2012-01-10 165 views
0

我最近努力学习多线程,并遇到以下意外 - 至少对我来说 - 行为:printf在一次非常简单的代码中不会打印超过一行:这是一个printf()/ pthread错误,还是我错过了什么?

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
    char buffer[2]; 

    void * thread_routine(void * args){ 
     pthread_mutex_lock(&mutex); 
     pthread_cond_wait(&cond, &mutex); 
     printf("test %s\n test\n", buffer); 
     pthread_mutex_unlock(&mutex); 
     return(NULL); 
    } 

    int main(void){ 
     pthread_t thread; 
     pthread_create(&thread, NULL, thread_routine, NULL); 
     sleep(1); 
     buffer[0] = 'c'; 
     buffer[1] = '\0'; 
     pthread_mutex_lock(&mutex); 
     pthread_cond_signal(&cond); 
     pthread_mutex_unlock(&mutex); 
     sleep(10); 
     return(0); 
    } 

输出是

(等待10秒)

test prompt$] 

什么是错的代码?我怎么无法让printf一次打印两行?请注意,使用flockfile阻止stdout并使用funlockfile解锁不会改善情况。

+0

你还没有将'buffer'声明为'volatile',这不会有帮助。 – 2012-01-10 15:51:23

+4

你可以试着在每次调用printf()后运行'fflush(stdout);'看看是否改变了事情? – 2012-01-10 15:51:58

+0

如果你包含'#include's需要编译它,这将是一个出色的问题 – Flexo 2012-01-10 15:52:57

回答

2

如果您的程序在最后打印test prompt$]如您所说,这意味着您执行的版本没有"test %s\n test\n"中的第二个换行符。

换行符很重要,因为这是当输出被刷新到屏幕上时。请参阅Why does printf not flush after the call unless a newline is in the format string?以获得解释和建议。

尝试重新编译并重新运行您的问题中的确切代码,我敢打赌它会像预期的那样工作(它确实在我的盒子上)。

+0

其实,他的问题中的*确切代码*不会被编译。它缺少至少一个'#include'。 – 2012-01-10 16:00:02

+0

非常感谢。不知道这一点,并预期该字符串将被立即打印。谢谢。 – 2012-01-10 16:10:57

相关问题