pthread_cond_signal()的具体位置? - C/C - ChinaUnix.net
来源:百度文库 编辑:神马文学网 时间:2024/04/29 05:15:50
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放中间,但从编程规则上说,其他两种都可以
共享变量的状态改变必须遵守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放中间,但从编程规则上说,其他两种都可以
pthread_cond_signal()的具体位置? - C/C - ChinaUnix.net
pthread_cond_signal()的具体位置?
- c/c++讨论区 - - chinaunix.net
如何在autotools中使用其它动态库的方法 - C/C - ChinaUnix.net
写给C语言初学者的话! - C/C++ - ChinaUnix.net
[精彩] 如何在C语言中巧用正则表达式 - ChinaUnix.net
C#.Net的面试试题
Linux下C语言编程基础(Makefile) - Linx时代 - ChinaUnix.net
Ren-Huang‘s Blog | [C ]Visual C 的.NET Socket
C#.NET实现文件夹的复制
C/C++&.NET->图形处理 - 站长下载
ChinaUnix.net
.NET(C#)连接各类数据库
[C#/C ]C#调用非托管DLL的APIs - .NET人字拖 - 博客园
windows 控件限制用户的基本法门(c#.net 篇)
.net 2.0(c#)下简单的FTP应用程序
ASP.NET(C#)页面间传值的常见方法
asp.net(C#) 生成随机验证码的代码
C#.NET跨线程控件的相关操作
谁有《C 高级实用程序设计》- C程序汉字显示技术 那一章的源代码 C/C / 非技术区 - CSDN社区 community.csdn.net
如何保存SQL的money类型数据。 .NET技术 / VB.NET - CSDN社区 c...
请问各位大侠:C++的异常处理(try、catch、throw)与C语言的Setjmp()、Longjmp()机制有什么区别?非常感谢! C/C / C 语言 - CSDN社区 community.csdn.net
DotNet(.Net):新平台,C#:新语言
Visual C .NET编程讲座之五