码迷,mamicode.com
首页 > 系统相关 > 详细

Linux Condition Variable条件变量避免锁冲突

时间:2015-11-28 23:08:18      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:

条件变量Condition Variable的一般用法:

唤醒用法:

 1 struct {
 2     pthread_mutex_t mutex;
 3     pthread_cond_t cond;
 4     //whatever variables maintain the condition
 5 ) var = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, ... };//声明结构体并初始化
 6   
 7 pthread_mutex_lock(&var.mutex);
 8 //set condition true
 9 pthread_cond_signal(&var.cond):
10 pthread_mutex_unlock(&var.mutex);

等待用法:

1 pthread_mutex_lock(&var.mutex);
2 while (/*condition is false*/)
3   pthread_cond_wait(&var.cond, &var.mutex);
4 //modify condition
5 pthread_mutex_unlock(&var.mutex);

 

避免锁冲突:

有一种情况是,唤醒线程中调用pthread_cond_signal之后,假如立即调度等待线程。那么等待线程立即运行然后停止,因为它不能获取到锁。为了不影响等待线程及时获取锁,唤醒线程另一种写法是:

1 int dosignal;
2 pthread_mutex_lock(&nready.mutex);
3 dosignal = (nready.nready == 0);
4 nready.nready++;
5 pthread_mutex_unlock(&nready.mutex);
6 
7 //先释放锁,然后唤醒等待线程
8 if (dosignal)
9     pthread_cond_signal(&nready.cond);

即,先释放锁,然后唤醒。这样就避免了等待线程请求锁的冲突问题。而调用pthread_cond_wait之前必须加锁。

 

Linux Condition Variable条件变量避免锁冲突

标签:

原文地址:http://www.cnblogs.com/NerdWill/p/5003570.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!