这是一个printf()/ pthread错误,还是我错过了什么?

时间:2012-01-10 15:48:18

标签: c pthreads printf mutex

我最近努力学习多线程,并且遇到了以下意外 - 至少对我来说 - 行为:在非常简单的下面的代码中调用printf时,不会一次打印多行:

    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);
    }

输出

    test c

(等待10秒钟)

    test prompt$]

这段代码有什么问题?为什么我不能让printf一次打印两行?请注意,使用flockfile阻止stdout并使用funlockfile解锁不会改善这种情况。

1 个答案:

答案 0 :(得分:2)

如果您的程序在结尾处打印test prompt$],则表示您执行的版本没有"test %s\n test\n"中的第二个换行符。

换行很重要,因为这是输出刷新到屏幕的时候。有关说明和建议,请参阅Why does printf not flush after the call unless a newline is in the format string?

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