当前位置: 技术问答>linux和unix
线程里互斥和条件变量一起使用的问题,有点迷惑.
来源: 互联网 发布时间:2015-12-17
本文导语: A thread B thread 1 Lock M[b] 1 Lock M[b] 2 ... 2 while(queue i...
A thread B thread
1 Lock M[b] 1 Lock M[b]
2 ... 2 while(queue is empty){
3 cond_signal(C) cond_wait(C,M)[B]
4 Unlock M }
3 ...
4 Unlock M
请问:当B线程进入Lock M[b]因为队列空而在cond_wait(C,M)[B]处等待时,A进入Lock M[b],它怎么还有机会往下执行(B已经锁了)?
按照VC里对互斥和事件信号的理解,这是完全行不通的呀,请大侠作个讲解,谢谢!
1 Lock M[b] 1 Lock M[b]
2 ... 2 while(queue is empty){
3 cond_signal(C) cond_wait(C,M)[B]
4 Unlock M }
3 ...
4 Unlock M
请问:当B线程进入Lock M[b]因为队列空而在cond_wait(C,M)[B]处等待时,A进入Lock M[b],它怎么还有机会往下执行(B已经锁了)?
按照VC里对互斥和事件信号的理解,这是完全行不通的呀,请大侠作个讲解,谢谢!
|
pthread_cond_wait 函数原子的执行以下两个操作:
1, 给互斥锁解锁
2, 把调用线程投入睡眠直到另外某个线程调用pthread_cond_signal函数.
pthread_cond_wait返回前重新给互斥锁加锁.
所以当线程B调用pthread_cond_wait并睡眠的时候,锁已经被解开,这时候A就可以重新加锁了.
1, 给互斥锁解锁
2, 把调用线程投入睡眠直到另外某个线程调用pthread_cond_signal函数.
pthread_cond_wait返回前重新给互斥锁加锁.
所以当线程B调用pthread_cond_wait并睡眠的时候,锁已经被解开,这时候A就可以重新加锁了.