在多线程通信程序中,要等待的线程(通过wait() 条件变量)即使满足条件也不会唤醒某些人。欢迎对此问题发表任何意见。
我的系统由两个节点组成,这些节点执行计算并传达 互相计算数据。每个节点由5个线程组成,其作用如下
接收数据时出现问题,详细代码如下。
步骤A)接收数据的计算线程一直等到接收线程 在接收队列中推送计算线程ID为2字节的数据。
ulRecv.lock();
RecvCV->wait(ulRecv, [&] {
RecvPtr = RecvQueue->front();
return !RecvQueue->empty() && RecvPtr[0]==(id&0xff) && RecvPtr[1]==(id>>8);
});
步骤B)当接收线程从另一个节点接收数据时,该线程 将数据推送到Received Queue并执行notify_all()。
try {
SRecvSocket->recv(RecvBuf, Len);
}
catch ( SocketException& ) {}
RecvMtx->lock();
RecvQueue->push(RecvBuf);
RecvMtx->unlock();
RecvCV->notify_all();
步骤C)当计算线程通过以下方式注意到Received Queue中的数据时: notify_all(),该线程唤醒并从Received Queue中弹出数据,然后执行计算。
RecvPtr = RecvQueue->front();
RecvQueue->pop();
ulRecv.unlock();
问题是我的代码有时无法从步骤B移至步骤C。 我通过打印日志检查线程执行了步骤A和步骤B。 但是等待中的计算线程不会从等待阶段中唤醒。
此外,在单个计算线程(总共4个线程)的情况下,不会发生此问题。
我无法在代码中找到原因。 我希望有很多评论。预先感谢。