免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13500 | 回复: 16

[函数] 请教大家一个关于pthread_cond_timedwait的问题 [复制链接]

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-20 20:59 |显示全部楼层
请问一下pthread_cond_timedwait 在什么情况下,超时时间到了没返回?现在遇到了一个比较奇怪的问题。我设置的是超时时间是当前时间+5秒 但是一直阻塞在timedwait,时间超过了也没返回。之前有pthread_mutex_lock的。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2012-09-20 21:52 |显示全部楼层
那说明有某个其他代码点始终将mutex locked了, 导致cond_wait无法返回持有锁, 检查代码吧.

论坛徽章:
0
发表于 2012-09-20 21:54 |显示全部楼层
多线程编程,我接触很少。
不过建议你把代码贴出来,会有更多回答这个问题的牛人~

论坛徽章:
0
发表于 2012-09-20 22:26 |显示全部楼层
@linux_c_py_php
他这里用的 pthread_cond_timedwait     理论上会超时返回的

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2012-09-20 22:34 |显示全部楼层
?有问题吗?
  1. mutex_lock
  2. cond_wait //想返回必须拿到锁
  3. mutex_unlock
复制代码
Moon_Bird 发表于 2012-09-20 22:26
@linux_c_py_php
他这里用的 pthread_cond_timedwait     理论上会超时返回的

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-20 22:50 |显示全部楼层
linux_c_py_php 发表于 2012-09-20 21:52
那说明有某个其他代码点始终将mutex locked了, 导致cond_wait无法返回持有锁, 检查代码吧.


我是mutex lock 之后才timewait的,其他线程取不到锁吧?
mutex lock
printf("xxxxx")//这个有打印
timedwait//超时不返回

论坛徽章:
0
发表于 2012-09-20 22:54 |显示全部楼层
@sublx
timedwait   拿到锁后,做一些准备工作之后,会释放掉锁 并且阻塞等待条件发生
返回的时候 需要再次获取锁

@linux_c_py_php
我这样理解对吗?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2012-09-20 22:56 |显示全部楼层
汗...

lock上锁, cond_wait原子的放掉锁并挂起, 一旦超时或者被通知, 则当mutex空闲时cond_wait才得以返回并原子的持有锁.

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2012-09-20 23:02 |显示全部楼层
本帖最后由 linux_c_py_php 于 2012-09-20 23:02 编辑

举个例子, 什么叫原子:
  1. timeout = False
  2. lock(&mutex)
  3. while not goon and not timeout:
  4.    timeout = cond_wait(&mutex, &cond) #原子: (1, 释放mutex 2, 挂起)
  5. unlock(&mutex)
复制代码
假设cond_wait不原子, 假设先放掉锁, 过1秒才挂起.

1, 放掉锁但尚未挂起: 其他线程获得锁, 修改了goon, 并signal.
2, 过1秒后挂起:该线程进入挂起, 等待唤醒, 但实际步骤1的signal就是想唤醒, 结果那时候该线程还没挂起, 那个通知就没收到.

结果就是, 该线程丢失了一次事件, 对于绝大多数程序设计, 这是没法容忍的丢失.

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-20 23:10 |显示全部楼层
linux_c_py_php 发表于 2012-09-20 23:02
举个例子, 什么叫原子:假设cond_wait不原子, 假设先放掉锁, 过1秒才挂起.

1, 放掉锁但尚未挂起: 其他线程 ...


是不是timedwait之后(原子操作完成),会释放掉锁,然后如果这时候有另外的代码mutex lock 这个锁一直不释放,那么timedwait就永远获得不了空闲锁,所以到时间了也醒不了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP