(多线程通信程序)条件变量的wait()引起的线程不唤醒

时间:2019-07-20 10:01:32

标签: multithreading wait communication wakeup

在多线程通信程序中,要等待的线程(通过wait() 条件变量)即使满足条件也不会唤醒某些人。欢迎对此问题发表任何意见。

我的系统由两个节点组成,这些节点执行计算并传达 互相计算数据。每个节点由5个线程组成,其作用如下

  1. 主线程
  2. 发送线程:该线程通过发送套接字发送数据
  3. 接收线程:该线程通过接收套接字接收数据
  4. (两个)计算线程:这些多线程执行计算

接收数据时出现问题,详细代码如下。

步骤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个线程)的情况下,不会发生此问题。

我无法在代码中找到原因。 我希望有很多评论。预先感谢。

0 个答案:

没有答案