条件变量
1、怎么通俗地解释条件变量与信号机制的区别
区别1:条件变量好比发短信; 信号机制好比打电话。 别急,听我慢慢道来 1、条件变量支持广播方式唤醒等待者;而信号机制不支持,只能一个一个通知
这就好比,你要结婚了,发短信通知同学,可以群发;但是打电话,你只能挨个打
2、条件变量是无状态的,如果唤醒早于等待,则唤醒会丢失;信号机制是有状态的,可以记录唤醒的次数
这就好比,你发短信,同学可能收不到,比如,同学换手机了等原因;但是打电话,你是知道同学有没有收到你消息的
不过,条件变量也可以通过一些其他机制防止唤醒丢失(本质其实不是避免唤醒丢失,是避免进入无效等待) 区别2:条件变量好比全真七子;信号机制好比九指神丐洪七公。 1、条件变量需要配合互斥量一起使用;而信号量则是独来独往
全真七子分开来基本没啥战斗力,但是天罡北斗阵还是颇有威力;洪七公基本独来独往,战力自不用说。
2、全真七子拿得出手的就只有天罡北斗阵;洪七公则有降龙十八掌、打狗棒法、逍遥游、九阴真经等等
条件变量只能结合互斥量做同步用;信号机制除了做同步,还能用于共享资源并发访问加锁(二进制信号量)、进程并发数量控制等等(计数信号量,应用场景比较多,可各自发挥)
不第后赋菊
【作者】黄巢 【朝代】唐
待到秋来九月八,我花开后百花杀。
冲天香阵透长安,满城尽带黄金甲。
2、简介
条件变量是线程中的东西,就是等待某一条件的发生,和信号一样。
条件变量使我们可以睡眠等待某种条件出现。 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 条件变量类型为 pthread_cond_t。
条件变量和互斥锁一样,都有静态和动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量进行初始化,如下: pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 动态方式调用pthread_cond_init()函数,API定义如下: int pthread_cond_init(pthread_cond_t cond, pthread_condattr_t cond_attr) 尽管POSIX标准中为条件变量定义了属性,但在LinuxThreads中没有实现,因此cond_attr值通常为NULL,且被忽略。
条件变量是一种线程间同步的机制,使用条件变量为了防止竞争,都会和一个互斥锁配合使用。
3、学习条件变量
pthread_cond_init(&cond, NULL); /* 动态初始化条件变量 */
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; /* 静态初始化条件变量 */
pthread_cond_wait(&cond); /* 等待条件变量触发 */
pthread_cond_timedwait(&cond); /* 超时等待条件变量触发 */
pthread_cond_signal(&cond); /* 激活一个等待该条件的线程,单播 */
pthread_cond_broadcast(&cond); /* 激活所有等待该条件的线程,广播 */
pthread_cond_destroy(&cond); /* 销毁条件变量 */