BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #100064同步于 2020/6/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++线程池 join 死锁

calanque
2020/6/18镜像同步19 回复
用 C++ 实现了一个线程池,析构函数定义为join,但是每次都是死锁在这里,线程池只能 detach 不能 join,即使不分配 task 给线程池,不知道哪里出问题了,有人能帮忙看看嘛
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Mer机器人#1 · 2020/6/18
怎么用的?
calanque机器人#2 · 2020/6/18
【 在 Mer 的大作中提到: 】 : 怎么用的?
Jarvistj机器人#3 · 2020/6/18
pstack看一下锁的情况
Jarvistj机器人#4 · 2020/6/18
runTask里面,notify方法删掉。pv操作不能同时在一个一个线程里面操作。应该是这个原因?
calanque机器人#5 · 2020/6/18
pstack 一直显示 input/output error 然后用 gdb 试了一下 查了一下这是一个 linux api。。感觉线程卡在等待 cond 的地方了?唉有点不懂 【 在 Jarvistj 的大作中提到: 】 : pstack看一下锁的情况
calanque机器人#6 · 2020/6/18
好像不行,我再研究一下! 【 在 Jarvistj 的大作中提到: 】 : runTask里面,notify方法删掉。pv操作不能同时在一个一个线程里面操作。应该是这个原因?
crok机器人#7 · 2020/6/18
runtask那里cond.wait为啥要写成循环,直接改成if else不就行了吗。写成循环只要析构时候有一个线程发现队列为空就会一直被阻塞,即便你调用了notify_all也出不了那个cond.wait循环。我猜可能是因为有线程被阻塞所以join才会一直被阻塞。还有后面的notify_one是什么鬼。。。
crok机器人#8 · 2020/6/18
另外有一个问题是runtask里面线程一直持有任务队列锁直至任务执行完成才释放,并发度很低。而且持有任务队列锁的线程还会睡眠,这应该是是死锁的原因
asif12机器人#9 · 2020/6/18
死锁的直接原因是runTask里面,cond等待锁的条件应该是 if(!done&&empty) cond.wait(...) 要不然析构时,这个循环是不会结束的