【发布时间】:2013-07-25 06:07:15
【问题描述】:
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
int global;
int i = 30;
int j = 30;
int k = 30;
pthread_mutex_t mutex;
void* child1(void* arg)
{
while(k--)
{
pthread_mutex_lock(&mutex);
global++;
printf("from child1\n");
printf("%d\n",global);
pthread_mutex_unlock(&mutex);
}
}
void* child2(void* arg)
{
while(j--)
{
pthread_mutex_lock(&mutex);
global++;
printf("from child1\n");
printf("%d\n",global);
pthread_mutex_unlock(&mutex);
}
}
int main()
{
pthread_t tid1, tid2;
pthread_mutex_init(&mutex, NULL);
pthread_create(&tid1, NULL, child1, NULL);
pthread_create(&tid2, NULL, child2, NULL);
while(i--)
{
pthread_mutex_lock(&mutex);
global++;
printf("from main\n");
printf("%d\n",global);
pthread_mutex_unlock(&mutex);
}
return 0;
}
我是pthread和多线程的新手,这段代码的结果是from main xx和child1很少出现,三个线程从来没有一起出现过,有什么问题?
【问题讨论】:
-
printf()不一定会用换行符刷新输出,我不知道printf()的底层实现如何在这里工作,但在你开始更难之前箍,我建议添加一个fflush(stdout)以确保在每个线程的每次迭代中,输出缓冲区已在关键部分之间完全刷新,并且没有机会通过一些神奇的异步偶然事件被覆盖。如果简单的检查没有成功,那么请担心其他问题。