浅谈Linux条件变量的使用
作者:jingxian 时间:2023-08-25 22:42:22
Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费者算法的同步机制,允许线程以无竞争的方式等待特定条件的发生。
示例伪代码:
void* Thread1(void){
while(线程运行条件成立){
…
pthread_mutex_lock(qlock);
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,条件变量
0
投稿
猜你喜欢
CMS你究竟还能走多远?
2009-03-06 12:58:00
网络时代如何保护自己的隐私
2007-10-02 20:04:00
WordPress单日志添加AD及sidebar小工具的应用
2010-03-26 16:35:00
Adsense推介不带中国玩了?
2008-01-09 13:10:00
centOS7下Spark安装配置教程详解
2022-01-20 17:52:59
百度支付工具推出 关注百度C2C平台看点
2008-09-13 18:34:00
轻松搭建一个Windows SVN服务器
2009-08-02 20:41:00
Linux防火墙iptables入门教程
2022-05-07 17:57:25
IBM:从卖智力到卖能力
2009-10-16 14:44:00
秘笈:百度贴吧宣传不被封锁地址
2009-03-16 11:30:00
dedecms 5.5 伪静态化ReWrite规则
2010-12-08 16:47:00
借用SSL验证,让IIS信息访问更安全(3)
2007-03-27 09:46:00
教你去除Discuz!7.0有无新帖版块图标
2009-09-16 10:48:00
解决“WARNINGThe remote SSH server rejected X11 forwarding request.“警告(推荐)
2023-07-30 02:29:57
泛搜索时代,网站应该更擅长搜索
2009-10-06 14:16:00
WordPress评论表情启用以及自定义表情
2011-09-07 17:13:54
如何将名人博客作为有价值的网站内容
2008-05-15 12:10:00
将域名从Godaddy转移到Namecheap详细图文教程
2012-03-12 20:28:17
Discuz! 积分策略向导功能详解
2009-03-26 21:01:00
纯中文“.中国”域名会走多远
2009-11-12 12:46:00