pthread_cond_signal函数的使用[摘自百科]
2016-06-28 19:17
281 查看
pthread_cond_signal函数的作用
它的作用为发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.
如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
但使用pthread_cond_signal不会有“惊群现象”产生,它最多只给一个线程发信号。
假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。
如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。但无论如何一个pthread_cond_signal调用最多发信一次。
另外,互斥量的作用一般是用于对某个资源进行互斥性的存取,很多时候是用来保证操作是一个原子性的操作,是不可中断的。
用法
pthread_cond_wait必须放在
pthread_mutex_lock和
pthread_mutex_unlock之间,因为他要根据共享变量的状态来决定是否要等待,而为了不永远等待下去所以必须要在lock/unlock队中。
共享变量的状态改变必须遵守
lock/unlock的规则。
pthread_cond_signal即可以放在
pthread_mutex_lock和
pthread_mutex_unlock之间,也可以放在
pthread_mutex_lock和
pthread_mutex_unlock之后,但是各有各缺点。
之间的情况:
pthread_mutex_lock xxxxxxx pthread_cond_signal pthread_mutex_unlock
缺点:在某些线程的实现中,会造成等待线程从内核中唤醒(由于cond_signal)然后又回到内核空间(因为cond_wait返回后会有原子加锁的行为),所以一来一回会有性能的问题。
但是在LinuxThreads或者NPTL里面,就不会有这个问题,因为在Linux 线程中,有两个队列,分别是cond_wait队列和mutex_lock队列, cond_signal只是让线程从cond_wait队列移到mutex_lock队列,而不用返回到用户空间,不会有性能的损耗。所以在Linux中推荐使用这种模式。
之后的情况:
pthread_mutex_lock xxxxxxx pthread_mutex_unlock pthread_cond_signal
优点:不会出现之前说的那个潜在的性能损耗,因为在signal之前就已经释放锁了。
缺点:如果unlock和signal之前,有个低优先级的线程正在mutex上等待的话,那么这个低优先级的线程就会抢占高优先级的线程(cond_wait的线程),而这在上面的放中间的模式下是不会出现的。
所以,在Linux下最好pthread_cond_signal放中间,但从编程规则上说,其他两种都可以。
相关文章推荐
- UVA 11354 LCA+最小生成树
- 文章标题
- LeetCode - 59. Spiral Matrix II
- mysql数据完整性和约束
- 转发与重定向的区别与联系
- 嵌入式学习-uboot-lesson8-代码搬移
- Web开发中获取Spring的ApplicationContext的几种方式
- CSS学习笔记(一):定位与溢出
- Volley框架
- java 消息机制 ActiveMQ入门实例
- 欢迎使用CSDN-markdown编辑器
- Linux进程间通信——使用信号
- VC错误处理技术学习:断言(ASSERT)
- TP框架之多文件上传(2)
- Python学习笔记(二):字典
- SQL面试题
- ASP.NET MVC 网站开发总结(七)——C#操作图片:多张图的拼接(旋转)
- JS 和 Java 中URL特殊字符编码方式
- Uniyt热更新——LuaFrameWork学习(一)
- ViewPager无线轮播加小圆点