前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Posix信号量与cond条件变量,到底该选谁?

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

作者头像
看、未来
发布2020-08-26 10:43:21
2.5K0
发布2020-08-26 10:43:21
举报

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

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

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

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

信号量的优势:

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 条件变量的优势:要实现屏障同步,您将不能使用信号量。但条件变量是理想的。
  • 信号量的优势:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档