关于使用条件变量中的一些疑问
时间:2010-09-02
来源:互联网
在看UNIX网络编程第二卷,第三部分--同步,讲到互斥量与条件变量时,关于条件变量的用法,它给出了一种形式:
复制代码
然后,在最后又讲:“POSIX允许调用pthread_cond_signal的线程不必是与之关联的互斥体的线程。不过POSIX接着说:如果需要可预见的调度行为,那么必须用互斥锁锁住pthread_cond_signal调用。”
即,POSIX允许这样调用pthread_cond_signal:
复制代码
[/code]
我的疑问是,若用后面的方式调用pthread_cond_signal,会有什么样的不可预见的调度行为?
我个人认为完全没有问题:条件的等待者线程仍旧处于睡眠状态。相反,我觉得这种方式更加优雅,可以让其他线程更早的得到互斥锁。
但是我完全相信老先生的顾虑,他这么写绝对是有原因的。
还请各位不吝赐教,多谢!
- struct{
- pthread_mutex_t mutex;
- pthread_cond_t cond;
- 维护本条件的各个变量;
- }var = {
- PTHREAD_MUTEX_INITIALIZER,
- PTHREAD_COND_INITIALIZER,
- ...
- };
-
- pthread_mutex_lock(&var.mutex);
- 设置条件为真
- pthread_cond_signal(&var.cond);
- pthread_mutex_unlock(&var.mutex);
即,POSIX允许这样调用pthread_cond_signal:
- pthread_mutex_lock(&var.mutex);
- 条件状态变量=当前条件
- pthread_mutex_unlock&var.mutex);
- if(条件状态变量)
- pthread_cond_signal(&var.cond);
我的疑问是,若用后面的方式调用pthread_cond_signal,会有什么样的不可预见的调度行为?
我个人认为完全没有问题:条件的等待者线程仍旧处于睡眠状态。相反,我觉得这种方式更加优雅,可以让其他线程更早的得到互斥锁。
但是我完全相信老先生的顾虑,他这么写绝对是有原因的。
还请各位不吝赐教,多谢!
作者: yingqy88 发布时间: 2010-09-02
..................
兄弟姐妹们,有啥想法么?
兄弟姐妹们,有啥想法么?
作者: yingqy88 发布时间: 2010-09-02
可能是你判断if(条件变量真)的时候是ture的,
然后线程轮转,被别的线程把条件变量设置为假。
然后线程轮转回来,你的pthread_cond_signal(&var.cond);接着上面的执行,但是这时候条件变量已经是假了。
然后线程轮转,被别的线程把条件变量设置为假。
然后线程轮转回来,你的pthread_cond_signal(&var.cond);接着上面的执行,但是这时候条件变量已经是假了。
作者: davelv 发布时间: 2010-09-02
回复 davelv
您说的对,即当去signal的时候,其实条件又变为假了,唤醒的线程继续睡眠。但是应该也没有什么问题吧?
我不理解的地方是有哪些不可预见的调度行为。。。我觉得一切尽在掌握啊。。。
您说的对,即当去signal的时候,其实条件又变为假了,唤醒的线程继续睡眠。但是应该也没有什么问题吧?
我不理解的地方是有哪些不可预见的调度行为。。。我觉得一切尽在掌握啊。。。
作者: yingqy88 发布时间: 2010-09-02

作者: yingqy88 发布时间: 2010-09-02
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28