首页 > 解决方案 > C++ - 如何不错过来自多个线程的多个通知?

问题描述

在我的应用程序中,许多线程通知等待线程。有时这些通知在时间上彼此非常接近,等待线程会错过通知。有什么简单的方法可以解决这个问题吗?下面给出了一个小示例代码。在代码中,task2 通知等待线程,但等待线程 waitingForWork 错过了通知。

#include <condition_variable>
#include <iostream>
#include <thread>

std::mutex mutex_;
std::condition_variable condVar;

bool dataReady{ false };

void waitingForWork() {
    for (int i = 0; i < 2; i++)
    {
        std::cout << "Waiting " << std::endl;
        std::unique_lock<std::mutex> lck(mutex_);
        condVar.wait(lck, [] { return dataReady; });
        dataReady = false;
        std::cout << "Running " << std::endl;
    }
}

void task1() {
    std::this_thread::sleep_for(std::chrono::milliseconds{ 45 });
    std::lock_guard<std::mutex> lck(mutex_);
    dataReady = true;
    std::cout << "Task1 Done:" << std::endl;
    condVar.notify_one();

}

void task2() {
    std::this_thread::sleep_for(std::chrono::milliseconds{ 46 });
    std::lock_guard<std::mutex> lck(mutex_);
    dataReady = true;
    std::cout << "Task2 Done" << std::endl;
    condVar.notify_one();
}

int main() {

    std::cout << std::endl;

    std::thread t1(waitingForWork);               
    std::thread t2(task1);                 
    std::thread t3(task2);                 

    t1.join();
    t2.join();
    t3.join();

    std::cout << std::endl;
    system("pause");
}

标签: c++multithreadingcondition-variable

解决方案


这是一个多生产者单消费者问题。此处描述: 多消费者单生产者问题

所以基本上你必须改变你的代码,使每个线程都必须将通知写入线程安全队列。然后你的工作线程必须在这个队列上工作,并且不会再错过任何通知。


推荐阅读