我正在尝试编写一个ThreadPool / Manager,它可以通知线程执行大量工作,然后在完成后获得回调。不幸的是,如果我呼叫信号并等待几百次,它最终会失败。以下是以下实现:
Complete: 68
Start ParOp..: 0
Start ParOp..: 2
Start ParOp..: 1
Start ParOp..: 6
Start ParOp..: 3
Start ParOp..: 7
Start ParOp..: 4
Start ParOp..: 5
Job Complete: 0 10000000
Job Complete: 2 10100000
Job Complete: 1 11100000
Job Complete: 6 11100010
Job Complete: 7 11100011
Job Complete: 3 11110011
Job Complete: 4 11111011
Job Complete: 5 11111111
All Done
Complete: 69
Start ParOp..: 0
Start ParOp..: 2
Start ParOp..: 1
Start ParOp..: 6
Start ParOp..: 7
Start ParOp..: 3
Start ParOp..: 4
Job Complete: 0 10000000
Job Complete: 2 10100000
Job Complete: 1 11100000
Job Complete: 7 11100001
Job Complete: 4 11101001
Job Complete: 3 11111001
Job Complete: 6 11111011
从代码中可以看出,我尝试循环通过signal()和wait(),500次。通常在某个随机点,其中一个线程将无法接收等待信号,它将永远阻塞,导致代码失败。这是输出:
table = document.add_table(rows=rows, cols=cols)
如您所见,循环68成功,但循环69失败,因为线程5未能接收到信号,并且永远阻止等待。为什么会发生这种情况
答案 0 :(得分:0)
while(1)
无限循环(无异常或中断)的无限循环是未定义的行为。
for(auto i : threadCompletes) i = 0;
此行没有任何作用。使用引用来修改值
for (auto& i : threadCompletes) i = false;
我并不热衷于线程,但这看起来像设计中的缺陷。
void wait(){
recvMtx.lock();
recvMtx.unlock();
}