boost或者linux posix线程信号量死锁求释疑

waq12 2012-11-10 02:36:33
现在有两个操作,一个in,一个out,操作一块公共数据(类似数组)。
要求如果in和out同时处理相同的记录,就串行。如果处理不同的记录就需要支持并行。
我们现在的处理核心逻辑为两个死循环:
in:
while (true)
lock
设置当前row_id_in
while (row_id_in == row_id_out) cv_in.wait // 此处死锁
unlock

输入处理

// lock // 对是否死锁无影响
row_id_in置in特有空标识
cv_out.notify
// unlock // 对是否死锁无影响
out:
while (true)
lock
设置当前row_id_out
while (row_id_in == row_id_out) cv_out.wait // 此处死锁
unlock

输出处理

// lock // 对是否死锁无影响
row_id_out置out特有空标识
cv_in.notify
// unlock // 对是否死锁无影响

通过日志跟踪,发现如果in/out为相同的标识时,偶尔会出现notify唤醒另一线程的wait时未成功,之后马上又进入了下一次循环的wait。导致两个线程同时wait死锁!
当前代码的实现用的是boost与linux下的posix线程库,都出现死锁。求教下notify如果有这样的问题,那么所有的基于信号量的生产者消费者模式都有可能存在的问题?

上面的帖子老大说:
引用 2 楼 qq120848369 的回复:
不知道在说什么,

条件变量+互斥锁可以解决一切问题,死锁需要注意以下几个编程陷阱:

一,1:n如果1采取不挂起逻辑(队列满则抛弃),2采取挂起逻辑,那么1只要每次signal即可。
二,1:n如果1,n都采取挂起逻辑,那么大家都要brodcast才能防止死锁。
三,m:n要brodcast才能防止死锁。

这都是实践过的,任何条件判断都无法充分考虑到所……

由于系统机制,不能继续答复了。我想说的是:
嗯,老大说的很对。但现在的主要问题是notify可能失败,并让该线程进入下一个循环的wait,导致两个线程都wait。呈现出死锁的状态!对这个问题求解释的。
...全文
259 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbq199204 2012-11-10
  • 打赏
  • 举报
回复
引用 2 楼 zhuankeshumo 的回复:
有时,你的回复蛮搞笑的,貌似巧妙运用表情。(个人微见,哇哈哈)
waq12 2012-11-10
  • 打赏
  • 举报
回复
引用 5 楼 liuliufen 的回复:
看了下你的逻辑,貌似不应该这样写的,其实如上面所说:条件变量+互斥锁可以解决一切问题,却是是这样; 而你现在这里只需要在in == out的时候才需要加上互斥锁,所以把逻辑再理一下应该就可以得到正确的结果的;
非常感谢你能看了上面的伪码。其实这里的问题不是逻辑问题,而是一个notify函数的异步调用产生死锁的机制问题。也就是说:是不是对于某些情况,我们不该使用条件变量进行线程通讯。而哪些情况是可以使用的?
liuliufen 2012-11-10
  • 打赏
  • 举报
回复
看了下你的逻辑,貌似不应该这样写的,其实如上面所说:条件变量+互斥锁可以解决一切问题,却是是这样; 而你现在这里只需要在in == out的时候才需要加上互斥锁,所以把逻辑再理一下应该就可以得到正确的结果的;
liuliufen 2012-11-10
  • 打赏
  • 举报
回复
嗯,有所降低就说明有这方面的原因,你看还有没有其他的变量要用这个来修饰的;
waq12 2012-11-10
  • 打赏
  • 举报
回复
引用 1 楼 liuliufen 的回复:
如果根据变量row_id_in row_id_out来判断当前操作的时候,最好这两个变量类型加volatile修饰,以前也遇到过,不知道是不是这个导致的,楼主可以尝试下;
试了,通过日志发现两个线程还是会同时做wait,不过概率有所降低
newtee 2012-11-10
  • 打赏
  • 举报
回复
liuliufen 2012-11-10
  • 打赏
  • 举报
回复
如果根据变量row_id_in row_id_out来判断当前操作的时候,最好这两个变量类型加volatile修饰,以前也遇到过,不知道是不是这个导致的,楼主可以尝试下;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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