现在有两个操作,一个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如果有这样的问题,那么所有的基于信号量的生产者消费者模式都有可能存在的问题?
上面的帖子老大说:
由于系统机制,不能继续答复了。我想说的是:
嗯,老大说的很对。但现在的主要问题是notify可能失败,并让该线程进入下一个循环的wait,导致两个线程都wait。呈现出死锁的状态!对这个问题求解释的。