- 论坛徽章:
- 0
|
本帖最后由 yingqy88 于 2010-09-03 08:54 编辑
在看UNIX网络编程第二卷,第三部分--同步,讲到互斥量与条件变量时,关于条件变量的用法,它给出了一种形式:
- struct{
- pthread_mutex_t mutex;
- pthread_cond_t cond;
- 维护本条件的各个变量;
- }var = {
- PTHREAD_MUTEX_INITIALIZER,
- PTHREAD_COND_INITIALIZER,
- ...
- };
- pthread_mutex_lock(&var.mutex);
- if(条件为假)
- pthread_cond_signal(&var.cond);//昨天这里编辑有误
- 设置条件为真;
- pthread_mutex_unlock(&var.mutex);
复制代码 然后,在最后又讲:“POSIX允许调用pthread_cond_signal的线程不必是与之关联的互斥体的线程。不过POSIX接着说:如果需要可预见的调度行为,那么必须用互斥锁锁住pthread_cond_signal调用。”
即,POSIX允许这样调用pthread_cond_signal:
- int dosignal;
- pthread_mutex_lock(&var.mutex);
- dosignal=(当前条件==假)
- 设置条件为真
- pthread_mutex_unlock&var.mutex);
- if(dosignal)
- pthread_cond_signal(&var.cond);
复制代码 我的疑问是,若用后面的方式调用pthread_cond_signal,会有什么样的不可预见的调度行为?
我个人认为完全没有问题:条件的等待者线程仍旧处于睡眠状态。相反,我觉得这种方式更加优雅,可以让其他线程更早的得到互斥锁。
但是我完全相信老先生的顾虑,他这么写绝对是有原因的。
还请各位不吝赐教,多谢! |
|