为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用
来源:互联网 发布:mac中的远程光盘 编辑:程序博客网 时间:2024/05/18 12:39
转自:http://blog.sina.com.cn/s/blog_6ffd3b5c0100mc3n.html
举一个例子(http://blog.csdn.net/KataDoc360/archive/2009/02/16/3897957.aspx):
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count = 0;
pthread_cond_t count_nonzero;
unsigned count = 0;
decrement_count () {
}
increment_count(){
pthread_mutex_lock(&count_lock);
}
decrement_count和increment_count在两个线程A和B中被调用。
正确的情况下,如果decrement_count首先运行,那么A会被阻塞到pthread_cond_wait。随后increment_count运行,它调用pthread_cond_signal唤醒等待条件锁count_nonzero的A线程,但是A线程并不会马上执行,因为它得不到互斥锁count_lock。当B线程执行pthread_mutex_unlock之后A线程才得以继续执行。
如果pthread_cond_signal前后没有使用互斥锁count_lock保护,可能的情况是这样。A阻塞到pthread_cond_wait,然后B执行到pthread_cond_signal时候,发生了线程切换,于是A被唤醒,并且发现count依然是0,所以继续阻塞到条件锁count_nonzero上。然后B继续执行,这时候尽管count=1,A永远不会被唤醒了。这样就发生了逻辑错误。
当然在这个上下文中,如果把count=count+1放在函数放在pthread_cond_signal之前变成
increment_count(){
count=count+1;
}
这样没有问题。但是这种方法并不能保证所有情况下都适用。于是需要用互斥锁保护条件锁相关的变量。也就是说条件锁是用来线程通讯的,但是互斥锁是为了保护这种通讯不会产生逻辑错误,可以正常工作。
0 0
- 为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用
- 嵌入式 线程同步的时候pthread_cond_t要和pthread_mutex_t搭配使用
- 线程同步 pthread_mutex_t pthread_cond_t sem_t
- pthread_mutex_t 和 pthread_cond_t 配合使用的简要分析
- pthread_cond_t和pthread_mutex_t的疑问?解决办法
- pthread_mutex_t和pthread_cond_t
- pthread_cond_t 和 pthread_mutex_t
- (转贴) Posix线程编程指南(3) 线程同步, 互斥锁pthread_mutex_t , 条件变量pthread_cond_t
- Linux线程浅析[线程的同步和互斥之线程同步的条件变量pthread_cond_t]
- 线程同步: 条件变量pthread_cond_t
- 生产者,消费者,pthread_cond_t pthread_mutex_t
- pthread_cond_t须用pthread_mutex_t保护
- pthread_cond_t, pthread_cond_broadcast()与 pthread_mutex_t
- pthread_cond_t 与 pthread_mutex_t(转载)
- pthread_cond_t 与 pthread_mutex_t(转载)
- pthread_cond_t和pthread_mutex_t(条件变量和互斥锁)
- 为什么要线程同步
- 为什么要线程同步的例子
- js获取 jquery获取页面shu
- 《Angular2之i18n运行机制》
- 设备树(待续)
- ORACLE 11g 使用ROWNUM完美解决ORA-00600:内部错误代码
- 区块链基础
- 为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用
- Java 异常
- win10 安装tensorflow 并测试mnist
- win10+ubuntu双系统,用refind引导
- swift系列:新手村第二周
- C++ STL的使用(vector)
- c语言如何实现函数重载
- 计算机网络基础学习笔记--网络层
- HDP 2.5集成Sqoop2