Posix信号量与cond条件变量,到底该选谁?

时间:2022-07-23
本文章向大家介绍Posix信号量与cond条件变量,到底该选谁?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

首先我们我觉得有必要再加深一下对于条件变量的理解, 以及对信号量的理解。

好,了解之后切入正题,条件变量和信号量是各有千秋的,虽然大方向上都是为了实现线程同步,但是实现过程是有一定差异的。

条件变量的优势:要实现屏障同步,您将不能使用信号量。但条件变量是理想的。
/*
屏障同步是指您希望所有线程都等待,直到每个线程都到达线程函数的某个部分。
这可以通过一个静态变量来实现,该静态变量最初是每个线程到达该屏障时递减的总线程的值。
这意味着我们希望每个线程都休眠,直到最后一个线程到达。
信号量的作用正好相反,使用信号量时,每个线程将继续运行,最后一个线程(将信号量值设置为0)将进入睡眠状态。
*/

条件变量需要和互斥锁搭配使用,条件变量的广播功能是信号量所不具备的。

信号量的优势:

信号量可以实现互斥量,大部分情况下也可以实现条件变量。甚至使用信号量的实现远比其他实现更容易理解。然而很多时候使用信号量替换条件变量的可能会降低并发程序的性能。

不过, 信号量除了可以作为二值计数器用于模拟线程锁和条件变量之外, 还有比它们更加强大的功能, 信号量可以用做资源计数器, 
也就是说初始化信号量的值为某个资源当前可用的数量, 使用了一个之后递减, 归还了一个之后递增

信号量与线程锁,条件变量相比还有以下几点不同: 1)锁必须是同一个线程获取以及释放, 否则会死锁.而条件变量和信号量则不必. 2)信号的递增与减少会被系统自动记住, 系统内部有一个计数器实现信号量,不必担心会丢失, 而唤醒一个条件变量时,如果没有相应的线程在等待该条件变量, 这次唤醒将被丢失.

个人感觉,建议使用条件变量。

这是我的条件变量封装。 提取码:c43u