关于 pthread_cond_wait 函数,顺序是怎样的呢

yuanhaitaozz 2015-01-30 02:41:38
在使用条件变量的时候,下面哪个步骤是正确的?
1、对互斥量加锁
2、改变互斥量保护的条件
3、给等待条件的线程发信号
4、对互斥量解锁
或者
1、对互斥量加锁
2、改变互斥量保护的条件
3、对互斥量解锁
4、给等待信号的线程发信号

这个是APUE上的一道课后题,也是我平时遇到的问题,虽然书上解释了,但我依旧没理解。
书上说这两种都可能是正确的,但都存在一定的问题。
请大家帮我看一下这之间存在的问题好吗?尤其是第二种 书上这话我有点看不懂
谢谢大家了
...全文
238 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanhaitaozz 2015-02-01
  • 打赏
  • 举报
回复
引用 5 楼 zhxianbin 的回复:
1、对互斥量加锁 2、改变互斥量保护的条件 3、给等待条件的线程发信号 4、对互斥量解锁 //等待线程收到在 第3步发送的信号 而运行,但又立刻阻塞在互斥锁上,因为此时持有锁的线程 第4步 还未运行 或者 1、对互斥量加锁 2、改变互斥量保护的条件 3、对互斥量解锁 4、给等待信号的线程发信号 //第3步后,可能另一线程运行并使条件为假,这时在第 4 步后,线程就不应该运行,如果不判断条件、仅仅因为 pthread_cond_wait返回就运行则错了,强调的是要同时判断两者
嗯 谢谢 真是不知道为什么我自己看的时候就是觉得迷迷糊糊的
zhxianbin 2015-02-01
  • 打赏
  • 举报
回复
1、对互斥量加锁 2、改变互斥量保护的条件 3、给等待条件的线程发信号 4、对互斥量解锁 //等待线程收到在 第3步发送的信号 而运行,但又立刻阻塞在互斥锁上,因为此时持有锁的线程 第4步 还未运行 或者 1、对互斥量加锁 2、改变互斥量保护的条件 3、对互斥量解锁 4、给等待信号的线程发信号 //第3步后,可能另一线程运行并使条件为假,这时在第 4 步后,线程就不应该运行,如果不判断条件、仅仅因为 pthread_cond_wait返回就运行则错了,强调的是要同时判断两者
yuanhaitaozz 2015-02-01
  • 打赏
  • 举报
回复
引用 3 楼 zhxianbin 的回复:
书上怎么说的?
书上说: 这两种情况可能都是正确的,但每一种方法都有不足之处。 在第一种情况下,等待线程可能会被安排在调用 pthread_cond_broadcast之后运行。如果程序运行在多处理机上,由于还持有互斥锁,一些线程就会运行而马上阻塞。 在第二种情况下,运行线程可以在第三步和第四步之间获取互斥锁,然后使条件失效,最后释放互斥锁。接着,当调用 pthread_cond_broadcast时,条件不再为真,线程无需运行,这就使为什么唤醒线程必须重新检查条件,不能仅仅因为 pthread_cond_wait返回就假定条件就为真。
zhxianbin 2015-01-31
  • 打赏
  • 举报
回复
书上怎么说的?
  • 打赏
  • 举报
回复
楼上正解,unp卷2一书上有详细讲解条件变量
帅得不敢出门 2015-01-31
  • 打赏
  • 举报
回复
pthread_mutex_lock while (!条件) pthread_cond_wait pthread_mutex_unlock ============================== pthread_mutex_lock 设置条件 pthread_cond_signal pthread_mutex_unlock

23,128

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧