【问题标题】:Is this a printf()/pthread bug, or am I missing something?这是一个 printf()/pthread 错误,还是我遗漏了什么?
【发布时间】:2012-02-07 00:44:01
【问题描述】:

我最近努力学习多线程,并遇到了以下意外 - 至少对我来说 - 行为: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 解锁并不能改善这种情况。

【问题讨论】:

  • 您还没有将buffer 声明为volatile,这将无济于事。
  • 您能否在每次调用printf() 后尝试运行fflush(stdout); 看看是否会有所改变?
  • 如果您包含编译此文件所需的#includes,那将是一个很好的问题
  • @undur_gongor:我冒昧地恢复了输出第二部分中缺少换行符的情况,因为我认为这是这个问题的关键(请参阅下面的答案)。
  • @oli-charlesworth,这里不需要volatile。使用适当的锁定功能就足够了。一旦一个函数被调用,编译器必须假设buf可能已经改变,并在唤醒后再次读取。

标签: c pthreads printf mutex


【解决方案1】:

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

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

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

【讨论】:

  • 实际上,他的问题中的确切代码不会编译。它至少缺少一个#include
  • 非常感谢。不知道这一点,并希望立即打印字符串。谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多