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条件变量的使用全部内容了,希望大家多多支持小牛知识库~
本文向大家介绍浅谈Linux的库文件,包括了浅谈Linux的库文件的使用技巧和注意事项,需要的朋友参考一下 最近在Linux下使用第三方库Protobuf时,遇到一个问题:可执行程序在运行时报错:“error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file
本文向大家介绍浅谈互斥锁为什么还要和条件变量配合使用,包括了浅谈互斥锁为什么还要和条件变量配合使用的使用技巧和注意事项,需要的朋友参考一下 mutex体现的是一种竞争,我离开了,通知你进来。 cond体现的是一种协作,我准备好了,通知你开始吧。 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用。
本文向大家介绍浅谈JavaScript的全局变量与局部变量,包括了浅谈JavaScript的全局变量与局部变量的使用技巧和注意事项,需要的朋友参考一下 一、JavaScript scope 的划分标准是function函数块,不是以 if、while、for来划分的 二、JavaScript在执行之前会对整个脚本文件进行预编译(对脚本文件的声明部分做分析,包括局部变量部分),从而确定实变量的作用域
本文向大家介绍浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释,包括了浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释的使用技巧和注意事项,需要的朋友参考一下 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明:
问题内容: 我正在尝试在Linux中实现非常简单的Windows事件。仅针对我的情况-3个线程,1个主线程和2个辅助线程。每个辅助线程通过SetEvent引发1个事件,主线程等待它。例: 因此,要实现它,我使用条件变量。但是我的问题是-这是正确的方法吗?还是我做错了什么?我的实现: 一切似乎都很好,但是我认为,当我在辅助线程中的SetEvent被调用之前,在主线程中调用WaitFor ..函数时,
本文向大家介绍浅谈Linux下修改/设置环境变量JAVA_HOME的方法,包括了浅谈Linux下修改/设置环境变量JAVA_HOME的方法的使用技巧和注意事项,需要的朋友参考一下 1. 永久修改,对所有用户有效 # vi /etc/profile //按键盘[Shift + g], 在profile文件最后添加下面的内容: [注]:修改文件后如果想马上生效,还要运行 #source