浅谈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
  • asp之家 网站运营 m.aspxhome.com