Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费者算法的同步机制,允许线程以无竞争的方式等待特定条件的发生。
示例伪代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void* Thread1(void){
while(线程运行条件成立){
…
while(条件成立)
pthread_cond_wait(qcond,
qlock);
或者
pthread_cond_wait(qcond,qlock,timeout);
reset条件变量…
pthread_mutex_unlock(qlock);
}
}
void* Thread2(void){
while(线程运行条件成立){
…
pthread_mutex_lock(qlock);
set了条件变量…//可以发送处理信号
pthread_cond_signal(qcond);
或者
pthread_cond_broadcast(qcond);
pthread_mutex_unlock(qlock);
}
}
条件变量需要配合互斥量一起使用,互斥量作为参数传入wait函数,函数把调用线程放到等待条件的线程列表上,然后对互斥量解锁,这两个是原子操作。当线程等待到条件,从wait函数返回之前,会再次锁住互斥量。
1.Lock
2.Unlock
3.等待
4.Lock
5.Unlock
第2,3,4步是wait的内部操作
在wait被唤醒后,还需要在while中去检查条件,这是为了防止“惊群效应”,比如有两个线程同时阻塞在wait,先后醒来,快的线程做完处理然后把条件reset了,并且对互斥量解锁,此时慢的线程在wait里获得了锁(即第4步)返回,还再去做处理就会出问题。
以上就是小编为大家带来的浅谈Linux条件变量的使用全部内容了,希望大家多多支持服务器之家~
声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。