关于pthread_cond_signal与pthread_cond_broadcast的使用说明
2006-08-23 10:59
1911 查看
在code review中,我会发现很多人喜欢在pthread_mutex_lock()和pthread_mutex_unlock(()之间调用pthread_cond_signal或者pthread_cond_broadcast函数,从逻辑上来说,这种使用方法是完全正确的。但是在多线程环境中,这种使用方法可能是低效的。posix1标准说,pthread_cond_signal与pthread_cond_broadcast无需考虑调用线程是否是mutex的拥有者,也就是所,可以在lock与unlock以外的区域调用。如果我们对调用行为不关心,那么请在lock区域之外调用吧。这里举个例子:
我们假设系统中有线程1和线程2,他们都想获取mutex后处理共享数据,再释放mutex。请看这种序列:
1)线程1获取mutex,在进行数据处理的时候,线程2也想获取mutex,但是此时被线程1所占用,线程2进入休眠,等待mutex被释放。
2)线程1做完数据处理后,调用pthread_cond_signal()唤醒等待队列中某个线程,在本例中也就是线程2。线程1在调用pthread_mutex_unlock()前,因为系统调度的原因,线程2获取使用CPU的权利,那么它就想要开始处理数据,但是在开始处理之前,mutex必须被获取,很遗憾,线程1正在使用mutex,所以线程2被迫再次进入休眠。
3)然后就是线程1执行pthread_mutex_unlock()后,线程2方能被再次唤醒。
从这里看,使用的效率是比较低的,如果再多线程环境中,这种情况频繁发生的话,是一件比较痛苦的事情。
所以觉得,如果程序不关心线程可预知的调度行为,那么最好在锁定区域以外调用他们吧:-)
如果读者喜欢英文的话,可以参考:
http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_cond_broadcast.html
这里罗嗦几句,对于
如果要正确的使用pthread_mutex_lock与pthread_mutex_unlock,请参考
pthread_cleanup_push和pthread_cleanup_pop宏,它能够在线程被cancel的时候正确的释放mutex!
我们假设系统中有线程1和线程2,他们都想获取mutex后处理共享数据,再释放mutex。请看这种序列:
1)线程1获取mutex,在进行数据处理的时候,线程2也想获取mutex,但是此时被线程1所占用,线程2进入休眠,等待mutex被释放。
2)线程1做完数据处理后,调用pthread_cond_signal()唤醒等待队列中某个线程,在本例中也就是线程2。线程1在调用pthread_mutex_unlock()前,因为系统调度的原因,线程2获取使用CPU的权利,那么它就想要开始处理数据,但是在开始处理之前,mutex必须被获取,很遗憾,线程1正在使用mutex,所以线程2被迫再次进入休眠。
3)然后就是线程1执行pthread_mutex_unlock()后,线程2方能被再次唤醒。
从这里看,使用的效率是比较低的,如果再多线程环境中,这种情况频繁发生的话,是一件比较痛苦的事情。
所以觉得,如果程序不关心线程可预知的调度行为,那么最好在锁定区域以外调用他们吧:-)
如果读者喜欢英文的话,可以参考:
http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_cond_broadcast.html
这里罗嗦几句,对于
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime); ,一定要在mutex的锁定区域内使用。
如果要正确的使用pthread_mutex_lock与pthread_mutex_unlock,请参考
pthread_cleanup_push和pthread_cleanup_pop宏,它能够在线程被cancel的时候正确的释放mutex!
相关文章推荐
- 关于pthread_cond_signal与pthread_cond_broadcast的使用说明
- 关于pthread_cond_signal与pthread_cond_broadcast的使用说明
- 条件锁(条件Mutex)pthread_cond_wait、pthread_cond_signal、pthread_cond_broadcast的使用
- 条件锁(条件Mutex)pthread_cond_wait、pthread_cond_signal、pthread_cond_broadcast的使用[转]
- 条件锁(条件Mutex)pthread_cond_wait、pthread_cond_signal、pthread_cond_broadcast的使用
- pthread_cond_broadcast与pthread_cond_signal使用区别
- pthread_cond_broadcast和pthread_cond_wait的使用
- liunx:pthread_cond_t条件变量pthread_cond_wait、pthread_cond_signal、pthread_cond_broadcast
- 关于 pthread_cond_wait 和 pthread_cond_signal , signal 无效的问题
- 关于pthread_cond_signal函数(mark一下)
- 该使用pthread_sleepon_signal() 还是 pthread_sleepon_broadcast()
- Linux 2. 关于pthread_cond_signal 唤醒两个线程的问题
- posix多线程程序使用条件变量 pthread_cond_signal
- C语言pthread_cond_wait与pthread_cond_signal的使用
- pthread_cond_wait和pthread_cond_signal以及互斥变量的使用情况
- 关于线程库pthread_cond_signal丢失的问题
- pthread_cond_signal函数的使用[摘自百科]
- 关于pthread_cond_wait()使用的理解
- 关于如何使用pthread_cond_timedwait()超时接口
- 关于如何使用pthread_cond_timedwait()超时接口