QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1010|回复: 3

关于pthread编程

[复制链接]
发表于 2004-2-24 19:27:10 | 显示全部楼层 |阅读模式
哪位大侠可心指导一下:关于线程函数pthread_cond_wait(&cond,&mutex);中,为什么先解锁,再加锁?如果这样解锁之后,其它线程可以锁定,再发送signal之后不解锁,那么第一个线程还是得不到运行?
pthread_cond_wait()函数为什么要先解锁呢?
发表于 2004-2-26 00:54:17 | 显示全部楼层
pthread_cond_wait就如其函数名所示,是一个等待条件变量的函数,条件变量与互斥量的区别在于:互斥量用来同步对共享数据的访问,如一个队列Q的互斥量mutex,你要访问Q必须在mutex未被锁的情况下,而且你使用Q之前还要锁住mutex。条件变量是一种信号,比如说队列Q空或非空。有这个条件变量的存在是因为有些应用用得上它(比如,你想在队列空时写数据进去)。

假如现在你发现队列非空(怎么发现,记住一定要先锁住队列Q,才能查队列是否空),那你只好什么都不能做(因为你的计划是等Q空再做点有事情--比如给队列加点什么东西)。你就只好等---- 等队列空 ----这就是那个条件变量的作用。那怎么等?(注意,开始进入pthread_cond_wait函数了)千万别忘了等之前要将你曾经锁住的Q解锁(总得给别人机会接近队列Q吧)!这就是pthread_cond_wait要先解mutex锁的原因。现在,你终于等到队列空了(由别的线程--比如取走了队列全部内容的那个--广播这个条件变量为真----实际上就是说队列已经空了,要做事的来吧),这时又想想为什么要等到时队列空?因为你想在这个队列上做点事,那么,显然,你得再把它(队列Q)锁上。这样你就得又给mutex加锁(然后,当然就退出pthread_cond_wait了,之后,按正常的程序就应该对Q作些操作了)。看看上述对mutex,Q,条件变量的操作顺序(有点头晕),再记住队列是共享数据,要互斥访问,我想对这个线程函数的运行要了解一点吧。

只是抛砖引玉(说不定砖都不是,只是一团烂泥),望指出其中的错误。祝论坛的人快乐!特别是Agadoo,hibernate,Xiaocong213.
回复

使用道具 举报

 楼主| 发表于 2004-3-5 14:02:19 | 显示全部楼层
这位兄弟真是高手,讲的太清楚了!非常感谢,有机会共同讨论些问题。
我的msn:[email protected]
回复

使用道具 举报

发表于 2004-3-7 21:24:04 | 显示全部楼层
好啊,互相交流
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 20:45 , Processed in 0.039387 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表