信号量大多数情况下可以淘汰条件变量
来源:互联网 发布:软件开发方法学 编辑:程序博客网 时间:2024/04/29 07:30
多线程编程中,发现同步和互斥的手段中,条件变量见到的是最少的。后来查找资料
发现:使用信号量完全可以模拟条件变量,而且通常更加具有优势。
可以用信号量模拟锁和条件变量:
1) 锁,在同一个线程内同时对某个信号量先调用sem_wait再调用sem_post, 两个函数调用其中的区域就是所要保护的临界区代码了,这个时候其实信号量是作为二值计数器来使用的.不过在此之前要初始化该信号量计数为1,见下面例子中的代码.
2) 条件变量,在某个线程中调用sem_wait, 而在另一个线程中调用sem_post.
1) 锁,在同一个线程内同时对某个信号量先调用sem_wait再调用sem_post, 两个函数调用其中的区域就是所要保护的临界区代码了,这个时候其实信号量是作为二值计数器来使用的.不过在此之前要初始化该信号量计数为1,见下面例子中的代码.
2) 条件变量,在某个线程中调用sem_wait, 而在另一个线程中调用sem_post.
不过, 信号量除了可以作为二值计数器用于模拟线程锁和条件变量之外, 还有比它们更加强大的功能, 信号量可以用做资源计数器, 也就是说初始化信号量的值为某个资源当前可用的数量, 使用了一个之后递减, 归还了一个之后递增
可以看见,采用信号量作为资源计数之后, 代码变得"很直白",原来的一些保存队列状态的变量都不再需要了.
信号量与线程锁,条件变量相比还有以下几点不同:
1)锁必须是同一个线程获取以及释放, 否则会死锁.而条件变量和信号量则不必.
2)信号的递增与减少会被系统自动记住, 系统内部有一个计数器实现信号量,不必担心会丢失, 而唤醒一个条件变量时,如果没有相应的线程在等待该条件变量, 这次唤醒将被丢失.
信号量与线程锁,条件变量相比还有以下几点不同:
1)锁必须是同一个线程获取以及释放, 否则会死锁.而条件变量和信号量则不必.
2)信号的递增与减少会被系统自动记住, 系统内部有一个计数器实现信号量,不必担心会丢失, 而唤醒一个条件变量时,如果没有相应的线程在等待该条件变量, 这次唤醒将被丢失.
综上所述:信号量大多数情况下可以淘汰条件变量
0 0
- 信号量大多数情况下可以淘汰条件变量
- 条件变量&信号量
- 互斥锁、条件变量、信号量
- 互斥锁 条件变量 信号量
- 互斥锁、条件变量、信号量
- 信号量,互斥锁,条件变量
- 互斥锁、条件变量、信号量
- 条件变量和信号量
- Linux系统下的多线程编程-条件变量&信号量
- Linux下利用条件变量实现信号量机制
- linux下的互斥锁,条件变量和信号量
- Linux系统下的多线程编程-条件变量&信号量
- Linux下多线程同步方式之互斥量,信号量,条件变量
- 实现信号量(四) 条件变量实现信号量
- 条件变量实现信号量机制
- 互斥量 信号量 条件变量编程
- 互斥锁-条件变量-信号量总结
- linux下多线程同步机制之信号量、互斥量、读写锁、条件变量
- HDU 1251 统计难题
- HDU 3397 Sequence Operation
- ZOJ 1109 Language of FatMouse
- ZOJ 1808 Immediately Decodable
- java基础__获取键盘输入值(了解即可)
- 信号量大多数情况下可以淘汰条件变量
- 基础KMP两道
- 判断网络异常
- 贪心算法概述
- Mango Weekly Training Round #3 解题报告
- 查看系统TPM是否可用的一种白痴型方法
- 两道相似KMP题
- UVA 11992 Fast Matrix Operations (二维线段树)
- POJ 2823 Sliding Window 再探单调队列