返回信息流用 C++ 实现了一个线程池,析构函数定义为join,但是每次都是死锁在这里,线程池只能 detach 不能 join,即使不分配 task 给线程池,不知道哪里出问题了,有人能帮忙看看嘛
这是一条镜像帖。来源:北邮人论坛 / cpp / #100064同步于 2020/6/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++线程池 join 死锁
calanque
2020/6/18镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
pstack 一直显示 input/output error
然后用 gdb 试了一下
查了一下这是一个 linux api。。感觉线程卡在等待 cond 的地方了?唉有点不懂
【 在 Jarvistj 的大作中提到: 】
: pstack看一下锁的情况
好像不行,我再研究一下!
【 在 Jarvistj 的大作中提到: 】
: runTask里面,notify方法删掉。pv操作不能同时在一个一个线程里面操作。应该是这个原因?
runtask那里cond.wait为啥要写成循环,直接改成if else不就行了吗。写成循环只要析构时候有一个线程发现队列为空就会一直被阻塞,即便你调用了notify_all也出不了那个cond.wait循环。我猜可能是因为有线程被阻塞所以join才会一直被阻塞。还有后面的notify_one是什么鬼。。。
死锁的直接原因是runTask里面,cond等待锁的条件应该是 if(!done&&empty) cond.wait(...)
要不然析构时,这个循环是不会结束的