为什么pthread_cond_wait需要互斥锁为参数
来源:互联网 发布:淘宝大学开网店 编辑:程序博客网 时间:2024/06/15 19:47
呃。。本人新人,下面只是我的猜想,如果有大神指错就更好了
先必须知道如下:
对于多线程条件变量,其pthread_cond_wait对同一个条件变量值能有一个有效。因为如果有多个,就会引起race condition(想想也知道:如果有多个pthread_cond_wait,那么pthread_cond_signal之后,哪个能起来呢)。
OK,有了这一点之后,就做如下推断:假如没有互斥量,那么有两个线程用不同的互斥量保护条件变量,一旦两个线程都等待同一个条件变量,就会出现如上问题。又看看pthread_cond_signal之后,只有一个条件变量,那么它就不能知道唤醒了那个锁保护的条件,因此必须加上互斥锁。
通过如上推断,看一看更加有趣的例子,如果用一个pthread_cond_signal之后,用两个锁保护的同一条件变量是否都能起来,还是编译出错呢。如果用pthread_cond_broadcast由会出现什么现象呢?
那么现在试一试:第一个编译不出错,但使出现了race condition(也就是两个都有机会执行,通过signal只唤醒了一个)。我用来两个pthread_cond_signal,发现两个都能被唤醒。用来pthread_cond_broadcast,发现也只唤醒了一个,难道用pthread_cond_broadcast只能做到唤醒具有同一个锁的的线程,经过证明发现确实如此。如下对应代码:
//相应部分可以相应改变代码
#include<stdio.h>
#include<pthread.h>
pthread_mutex_t pm_lock1;
pthread_mutex_t pm_lock2;
pthread_cond_t pc_lock;
void test1(void)
{
pthread_mutex_lock(&pm_lock1);
pthread_cond_wait(&pc_lock, &pm_lock1);
printf("test1!\n");
pthread_mutex_unlock(&pm_lock1);
return;
}
void test2(void)
{
pthread_mutex_lock(&pm_lock1);
pthread_cond_wait(&pc_lock, &pm_lock1);
printf("test2!\n");
pthread_mutex_unlock(&pm_lock1);
return;
}
int main()
{
pthread_t th1,th2;
pthread_mutex_init(&pm_lock1, NULL);
pthread_mutex_init(&pm_lock2, NULL);
pthread_cond_init(&pc_lock, NULL);
if (pthread_create(&th2, NULL, (void *)&test2, NULL)<0)
{
return -1;
}
if (pthread_create(&th1, NULL, (void *)&test1, NULL)<0)
{
return -1;
}
sleep(10);
pthread_cond_broadcast(&pc_lock);
pthread_join(th1, NULL);
pthread_join(th2,NULL);
return 0;
}
- 为什么pthread_cond_wait需要互斥锁为参数
- 为什么pthread_cond_wait需要传递mutex参数
- 为什么pthread_cond_wait需要传递mutex参数
- 参数需要LPCTSTR为什么可以传入CString
- strcpy 为什么需要返回值 为char*
- pthread_cond_wait()加一个while为什么的解释
- 参数为引用时需要注意的
- pthread_cond_wait()
- pthread_cond_wait
- pthread_cond_wait
- pthread_cond_wait
- pthread_cond_wait()
- pthread_cond_wait()
- pthread_cond_wait
- pthread_cond_wait
- pthread_cond_wait()
- pthread_cond_wait()
- pthread_cond_wait()
- HDu 5361
- iOS KVC setValuesForKeysWithDictionary的使用
- 第二周—项目3 体验复杂度—汉诺塔
- SSL协议到底工作在OSI模型中的那一层?
- Item 25:考虑实现一个不抛异常的swap Effective C++笔记
- 为什么pthread_cond_wait需要互斥锁为参数
- iOS 8 AutoLayout与Size Class
- 最长的可整合子数组的长度+累计和为k的最长子数组
- LAMP基础环境的搭建,即Linux、Apache、MySQL、PHP环境
- hdu1179最大匹配
- OAF学习笔记-22-多层菜单的制作
- 使用MySQL的jdbcutils配置多个数据源
- Codeforces Round #319 (Div. 2) B C D
- 谈谈如何说“不” [Y]