【发布时间】: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可能已经改变,并在唤醒后再次读取。