条件变量和信号量的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条件变量和信号量的区别相关的知识,希望对你有一定的参考价值。

条件变量
条件变量使在多线程程序中用来实现“等待--->唤醒”逻辑常用的方法,是进程间同步的一种机制。条件变量用来阻塞一个线程,直到条件满足被触发为止,通常情况下条件变量和互斥量同时使用。
一般条件变量有两个状态:
①一个/多个线程为等待"条件变量的条件成立"而挂起;
②另一个线程在"条件变量条件成立时"通知其他线程。
信号量
信号量是一种特殊的变量,访问具有原子性。
只允许对它进行两个操作:
①等待信号量:当信号量值为0时,程序等待;当信号量值大于0时,信号量减1,程序继续运行。
②发送信号量:将信号量值加1。
说明:Linux提供了一组信号量API,声明在头文件sys/sem.h中。
Linux条件变量和信号量的区别:
①使用条件变量可以一次唤醒所有等待者,而这个信号量没有的功能,感觉是最大区别。
②信号量始终有一个值,而条件变量是没有的,没有地方记录唤醒过多少次,也没有地方记录唤醒线程过多少次。从实现上来说一个信号量可以欧尼顾mutex+counter+condition
variable实现的。因为信号量有一个状态,如果想精准的同步,那么信号量可能会有特殊的地方。信号量可以解决条件变量中存在的唤醒丢失问题。
③信号量的意图在于进程间同步,互斥锁和条件变量的意图在于线程间同步,但是信号量也可用于线程间,互斥锁和条件变量也可用于进程间。应当根据实际的情况进行决定。信号量最有用的场景是用以指明可用资源的数量。
参考技术A 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信;

而条件变量、互斥锁,主要关注线程间通信。
参考技术B 线程同步的方式包括:互斥锁、读写锁、条件变量、信号量和令牌。以Java语言为例:用synchronized关键字修饰同步方法。同步有几种实现方法分别是synchronized,wait与notifywait():使一个线程处于等待状态,并且释放所持有的对象的lock。

信号量互斥锁和条件变量的区别

1、互斥锁总是必须由给其上锁的线程解锁,信号量的挂出确不必由执行过它的等待操作的同一线程执行。

技术图片

                                生产者与消费者伪代码

 

2、互斥锁要么被锁住,要么被解锁(二值状态,类似于二值信号量)

3、既然信号量有一个与之关联的状态(它的数值),那么信号量的挂出操作总是被记住。然而当向一个条件变量发送信号时,如果没有线程等待在该条件变量上,那么信号将丢失。

 

ps:提供信号量的原因是,在进程间同步的情况下,若没有涉及到共享内存区时,需要使用信号量。

 

以上是关于条件变量和信号量的区别的主要内容,如果未能解决你的问题,请参考以下文章

信号量互斥锁和条件变量的区别

信号量,互斥锁,读写锁和条件变量的区别

信号量与条件变量的区别

关于条件变量与互斥锁信号量的区别,Linux下线程同步的几种方法

信号量 互斥锁 条件变量的区别(讲的很好,值得收藏)

27 python 初学(信号量条件变量同步条件队列)