pthread_cond_wait详解
来源:互联网 发布:银行数据安全管理办法 编辑:程序博客网 时间:2024/06/03 12:20
对pthread_cond_wait一直不是很理解,看到一篇文章写的不错,原文在这里,
http://www.ibm.com/developerworks/cn/linux/thread/posix_thread3/#1
下面说一下,pthread_cond_wait(&mycond,&mymutex)的东西
1. 设计pthread_cond_wait 的初衷
线程如果需要等待某个条件发生,它该作何处理呢?它可以重复对互斥对象锁定和解锁,每次都会检查共享元素,以查找某个值。这样会比较浪费cpu的时钟周期。而且效率比较低,何不借鉴一下dma的处理办法,等待某个条件发生了通知一下,这样cpu就可以处理自己的事了,我想pthread_cond_wait的初衷就是这样的,也是这样被设计出来的。如果你有不同解释可以通知我,我们可以共同讨论。
2. pthread_cond_wait的内部操作
在调用之前需要锁定互斥对象,然后再调用pthread_cond_wait。
1> pthread_cond_wait所做的第一件事就是同时对互斥对象解锁(这样其它线程就可以修改共享对象了,操作之前不要忘记加锁哦)。
2> 等待条件通常是一个阻塞操作(这一点有点不明白,为什么是通常,难道说是还有其它动作,有知道的可以告诉我啊),这意味着线程将睡眠,在它苏醒之前不会消耗cpu周期(这正是我们想要的).线程睡呀睡呀,直到,有人叫它, 比如:另一个线程锁定了mymutex,并对共享对象对了某个动作.在对互斥对象解锁之后(this is very important),2号线程会立即调用函数pthread_cond_broadcast(&mycond)(这个地方也有点不明白, 我想不一定需要立即调用pthread_cond_broadcast,日比如有一个共享的线程数目 pthread_num = 5,当创建一个线程的时候pthread_num++,但是当该线程结束的时候pthread_num--,如果这个数小于5,我们就可以广播一下这个事件,激活一个线程,用以创建更多的线程)。
3> 调用pthread_cond_wait的线程被叫醒之后,将重新锁定mymutex,之后才返回。
下面画个图来表示一下期间锁的调用(是伪码)
lock(mutex) ----------------a.lock
pthread_cond_wait()
{
unlock(mutex)-------------a.unlock
if ( 条件不满足)
睡觉
else
{
lock(mutex)-------------b.lock
return
}
}
dosomething();
unlock(mutex);---------------b.unlock
这样就可以看出来锁的调用了吧。
http://www.ibm.com/developerworks/cn/linux/thread/posix_thread3/#1
下面说一下,pthread_cond_wait(&mycond,&mymutex)的东西
1. 设计pthread_cond_wait 的初衷
线程如果需要等待某个条件发生,它该作何处理呢?它可以重复对互斥对象锁定和解锁,每次都会检查共享元素,以查找某个值。这样会比较浪费cpu的时钟周期。而且效率比较低,何不借鉴一下dma的处理办法,等待某个条件发生了通知一下,这样cpu就可以处理自己的事了,我想pthread_cond_wait的初衷就是这样的,也是这样被设计出来的。如果你有不同解释可以通知我,我们可以共同讨论。
2. pthread_cond_wait的内部操作
在调用之前需要锁定互斥对象,然后再调用pthread_cond_wait。
1> pthread_cond_wait所做的第一件事就是同时对互斥对象解锁(这样其它线程就可以修改共享对象了,操作之前不要忘记加锁哦)。
2> 等待条件通常是一个阻塞操作(这一点有点不明白,为什么是通常,难道说是还有其它动作,有知道的可以告诉我啊),这意味着线程将睡眠,在它苏醒之前不会消耗cpu周期(这正是我们想要的).线程睡呀睡呀,直到,有人叫它, 比如:另一个线程锁定了mymutex,并对共享对象对了某个动作.在对互斥对象解锁之后(this is very important),2号线程会立即调用函数pthread_cond_broadcast(&mycond)(这个地方也有点不明白, 我想不一定需要立即调用pthread_cond_broadcast,日比如有一个共享的线程数目 pthread_num = 5,当创建一个线程的时候pthread_num++,但是当该线程结束的时候pthread_num--,如果这个数小于5,我们就可以广播一下这个事件,激活一个线程,用以创建更多的线程)。
3> 调用pthread_cond_wait的线程被叫醒之后,将重新锁定mymutex,之后才返回。
下面画个图来表示一下期间锁的调用(是伪码)
lock(mutex) ----------------a.lock
pthread_cond_wait()
{
unlock(mutex)-------------a.unlock
if ( 条件不满足)
睡觉
else
{
lock(mutex)-------------b.lock
return
}
}
dosomething();
unlock(mutex);---------------b.unlock
这样就可以看出来锁的调用了吧。
0 0
- 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_signal
- pthread_cond_signal与pthread_cond_wait详解
- pthread_cond_signal与pthread_cond_wait详解
- pthread_cond_signal与pthread_cond_wait详解
- pthread_cond_signal与pthread_cond_wait详解
- pthread_cond_signal与pthread_cond_wait详解
- pthread_cond_wait和pthread_cond_signal 用法详解
- pthread_cond_wait()
- pthread_cond_wait
- pthread_cond_wait
- 第十二周阅读程序四
- 关于不停实时读写串口发生崩溃时报错:This message is already in use.
- 引用与数组,引用与类,引用与返回值,引用与多态,const引用,引用类型
- 《设计模式》第一章
- 第12周-多继承、虚基类,继承和组合-课后实践·阅读程序
- pthread_cond_wait详解
- C++找对象的季节(补)——信春哥是否能永生?
- MVC简单生成静态化页面
- 软考之路--尾声
- 自定义顶部标题栏和其事件监听设置
- tarjan求强联通分量
- 经典的延续还是失败的开始?ARM cortex m7性能初探
- 程序员的量化交易之路(8)---金融概念Listing&delisting
- 99%的海量数据处理面试题