+ -
当前位置:首页 → 问答吧 → 关于使用条件变量中的一些疑问

关于使用条件变量中的一些疑问

时间:2010-09-02

来源:互联网

在看UNIX网络编程第二卷,第三部分--同步,讲到互斥量与条件变量时,关于条件变量的用法,它给出了一种形式:
  1. struct{
  2.         pthread_mutex_t mutex;
  3.         pthread_cond_t        cond;
  4.         维护本条件的各个变量;
  5. }var = {
  6.         PTHREAD_MUTEX_INITIALIZER,
  7.         PTHREAD_COND_INITIALIZER,
  8.         ...
  9. };

  10. pthread_mutex_lock(&var.mutex);
  11. 设置条件为真
  12. pthread_cond_signal(&var.cond);
  13. pthread_mutex_unlock(&var.mutex);
复制代码
然后,在最后又讲:“POSIX允许调用pthread_cond_signal的线程不必是与之关联的互斥体的线程。不过POSIX接着说:如果需要可预见的调度行为,那么必须用互斥锁锁住pthread_cond_signal调用。”

即,POSIX允许这样调用pthread_cond_signal:
  1. pthread_mutex_lock(&var.mutex);
  2. 条件状态变量=当前条件
  3. pthread_mutex_unlock&var.mutex);
  4. if(条件状态变量)
  5.     pthread_cond_signal(&var.cond);
复制代码
[/code]

我的疑问是,若用后面的方式调用pthread_cond_signal,会有什么样的不可预见的调度行为?
我个人认为完全没有问题:条件的等待者线程仍旧处于睡眠状态。相反,我觉得这种方式更加优雅,可以让其他线程更早的得到互斥锁。
但是我完全相信老先生的顾虑,他这么写绝对是有原因的。
还请各位不吝赐教,多谢!

作者: yingqy88   发布时间: 2010-09-02

..................
兄弟姐妹们,有啥想法么?

作者: yingqy88   发布时间: 2010-09-02

可能是你判断if(条件变量真)的时候是ture的,
然后线程轮转,被别的线程把条件变量设置为假。
然后线程轮转回来,你的pthread_cond_signal(&var.cond);接着上面的执行,但是这时候条件变量已经是假了。

作者: davelv   发布时间: 2010-09-02

回复 davelv


      您说的对,即当去signal的时候,其实条件又变为假了,唤醒的线程继续睡眠。但是应该也没有什么问题吧?
我不理解的地方是有哪些不可预见的调度行为。。。我觉得一切尽在掌握啊。。。

作者: yingqy88   发布时间: 2010-09-02

欢迎评论,谢谢

作者: yingqy88   发布时间: 2010-09-02

相关阅读 更多