免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3211 | 回复: 6
打印 上一主题 下一主题

[C] 【问】POSIX 线程库中的互斥锁和条件变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-24 17:31 |只看该作者 |倒序浏览
在网上看关于线程间同步时候对条件变量和互斥锁的描述:

互斥锁一个明显的缺点是他只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,他常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线承间的同步。

加粗的那一句话并不明白,感觉前面说的话并不能解释使用条件变量的原因。例如2个线程操作同一临界区时,通过互斥锁保护,若A线程已经加锁,B线程再加锁时候会被阻塞,直到A释放锁,B再获得锁运行,而条件变量同样是阻塞,还需要通知才能唤醒,怎末还说是弥补了互斥锁的不足呢?

条件变量的优点是什么??两者分别在什么情况下使用呢?感觉实际上作用差不多,只是条件变量强大一些。大家帮忙释疑一下。

[ 本帖最后由 什么名 于 2008-10-24 19:42 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-24 18:10 |只看该作者
希望我的这个帖子对你有所帮助

http://lipingtababa.blogspot.com ... ition-variable.html

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
3 [报告]
发表于 2008-10-24 18:18 |只看该作者
你可以把条件变量了解成信号,一个线程在等待信号,另外一个线程发送信号

论坛徽章:
0
4 [报告]
发表于 2008-10-24 19:23 |只看该作者
2楼  推荐的那篇文章不错,一目了然。学习了

论坛徽章:
0
5 [报告]
发表于 2008-10-24 19:36 |只看该作者
原帖由 lipingtababa 于 2008-10-24 18:10 发表
希望我的这个帖子对你有所帮助

http://lipingtababa.blogspot.com ... ition-variable.html

谢谢,很有见地!解惑不少!!

感觉可以总结为:条件变量用在某个线程需要在某种条件才去保护它将要操作的临界区的情况下,从而避免了线程不断轮询检查该条件是否成立而降低效率的情况,
在条件满足时,自动退出阻塞,再加锁进行操作。

APUE说:这样就关闭了条件检查和线程进入休眠等等条件改变这两个操作之间的时间通道。后半部分不理解。

论坛徽章:
0
6 [报告]
发表于 2008-10-24 22:34 |只看该作者

回复 #1 什么名 的帖子

如果你想了解深入点的话,请google搜索pub的帖子,关于pthread接口以及原理方面的,写的相当细致。

还有就是UNIX环境高级编程的最新版,关于线程接口方面,讨论也很详细的。

论坛徽章:
0
7 [报告]
发表于 2009-02-10 20:24 |只看该作者

回复 #5 什么名 的帖子

/**pthread_cond_wait(&qready, &qlock)的使用方法*****/

    pthread_mutex_lock(&qlock);   
    pthread_cond_wait(&qready, &qlock);
    pthread_mutex_unlock(&qlock);
/*****************************************************/
The mutex passed to pthread_cond_wait protects the condition.The caller passes it locked to the function, which then atomically places the calling thread on the list of threads waiting for the condition and unlocks the mutex. This closes the window between the time that the condition is checked and the time that the thread goes to sleep waiting for the condition to change, so that the thread doesn't miss a change in the condition. When pthread_cond_wait returns, the mutex is again locked.


上面是APUE的原话,就是说pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)函数传入的参数mutex用于保护条件,因为我们在调用pthread_cond_wait时,如果条件不成立我们就进入阻塞,但是进入阻塞这个期间,如果条件变量改变了的话,那我们就漏掉了这个条件。因为这个线程还没有放到等待队列上,所以调用pthread_cond_wait前要先锁互斥量,即调用pthread_mutex_lock(),pthread_cond_wait在把线程放进阻塞队列后,自动对mutex进行解锁,使得其它线程可以获得加锁的权利。当pthread_cond_wait返回的时候又自动给mutex加锁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP