通过多个线程通知单个线程

时间:2018-08-10 23:56:29

标签: c++ multithreading condition-variable

我有一个应用程序,其中有多个生产者线程和一个消费者线程。每个生产者线程在模拟中的随机时间通知使用者线程。有时,消费者线程错过了通知。有没有安全的方法可以使我们不错过任何通知。下面给出了示例代码。使用者线程waitingForWork错过了来自使用者线程task2的通知。

#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");
}

0 个答案:

没有答案