Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39298
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-08 13:03
个人简介

海纳百川有容乃大,壁立千仞无欲则刚。

文章分类
文章存档

2015年(17)

2014年(12)

我的朋友

分类: LINUX

2014-12-15 10:02:25

在学习条件变量一节时,想在机器上试一下。结果发现 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

  1. void
  2. process_msg(void)
  3. {
  4.         for (;;) {
  5.                 pthread_mutex_lock(&qlock);
  6.                 while (workq == NULL)
  7.                 {
  8.                         printf("wait...\n");
  9.                         pthread_cond_wait(&qready, &qlock);
  10.                 }
  11.                 pthread_mutex_unlock(&qlock);
  12.         }
  13. }

  14. int main()
  15. {
  16.         process_msg();
  17.         return 0;
  18. }

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) |
给主人留下些什么吧!~~