在学习条件变量一节时,想在机器上试一下。结果发现 pthread_cond_wait 竟然不阻塞。。。
之后猜想难道是主线程不会阻塞,于是又在线程函数中调用 phtread_cond_wait,只到发现以下错误才找到答案。。。
/tmp/cciM4NrQ.o: In function `main':
condvar.c:(.text+0xe3): undefined reference to `pthread_create'
collect2: ld returned 1 exit status
原来使用 pthread ,在编译时必须添加 -pthread选项 才能使 pthread正常工作。
另外,以下代码如果把printf("wait...\n") 改为 printf("wait...") 将看不到任何输出,估计和换行符冲洗缓冲区有关,先mark
-
void
-
process_msg(void)
-
{
-
for (;;) {
-
pthread_mutex_lock(&qlock);
-
while (workq == NULL)
-
{
-
printf("wait...\n");
-
pthread_cond_wait(&qready, &qlock);
-
}
-
pthread_mutex_unlock(&qlock);
-
}
-
}
-
-
int main()
-
{
-
process_msg();
-
return 0;
-
}
-
pthread_cond_signal 和 pthread_cond_broadcast:
当多个线程都调用了 pthread_cond_wait并阻塞,此时调用pthread_cond_signal时,将会从众多阻塞的线程中选择一个返回。我实验(最多开启20个线程)看到的结果是:返回顺序与阻塞顺序一致。
如果调用pthread_cond_broadcast,那么所有阻塞的线程都将同时返回。
另外,如果在调用 pthread_cond_wait之前就调用了 pthread_cond_signal或者pthread_cond_broadcase,pthread_cond_wait调用之后将继续阻塞,也就是pthread_cond_wait不受之前调用的影响。
书上的一句话是:
使用pthread_cond_wait等待条件变为真,。。。
另一句话是:
传递给pthread_cond_wait的互斥量对条件进行保护,调用者把锁住的互斥量传给函数。
函数把调用线程放到等待条件的线程列表上,然后对互斥量解锁,这两个操作是原子操作。
所以,我认为用真假简单的理解条件变量容易让人困惑。而应该这样理解:当调用pthread_cond_wait会将线程放入等待线程列表上,调用pthread_cond_signal或者pthread_cond_broadcase会将线程从等待队列移除。
阅读(508) | 评论(0) | 转发(0) |