C++中notify机制是如何实现的

   2024-09-30 8200
核心提示:在 C++ 中,std::condition_variable 类提供了一种条件变量,可以用于线程间的同步。它常与 std::mutex 和 std::unique_lock 或

在 C++ 中,std::condition_variable 类提供了一种条件变量,可以用于线程间的同步。它常与 std::mutexstd::unique_lockstd::lock_guard 结合使用。

当一个线程需要等待另一个线程完成某个操作时,可以使用条件变量。这里有两个主要的函数:wait()notify_one() / notify_all()

wait(): 当一个线程调用 cond_var.wait(lock, [&](){ return condition; }) 时,该线程会释放锁并等待条件变量 cond_var 被通知。一旦收到通知,线程将重新获取锁并检查条件是否满足。如果条件满足,则继续执行;否则,线程将再次等待通知。notify_one() / notify_all(): 当另一个线程完成操作并更改条件时,它可以调用 cond_var.notify_one()cond_var.notify_all() 来通知等待的线程。notify_one() 只唤醒一个等待的线程,而 notify_all() 唤醒所有等待的线程。

下面是一个简单的示例,展示了如何使用条件变量实现生产者-消费者模型:

#include<iostream>#include<thread>#include<queue>#include <mutex>#include<condition_variable>std::queue<int> data_queue;std::mutex mtx;std::condition_variable cond_var;const int max_queue_size = 5;void producer() {    for (int i = 0; i < 20; ++i) {        std::unique_lock<std::mutex> lock(mtx);        cond_var.wait(lock, [] { return data_queue.size() < max_queue_size; }); // 等待队列未满        data_queue.push(i);        std::cout << "Produced: " << i << std::endl;        lock.unlock();        cond_var.notify_one(); // 通知消费者    }}void consumer() {    while (true) {        std::unique_lock<std::mutex> lock(mtx);        cond_var.wait(lock, [] { return !data_queue.empty(); }); // 等待队列非空        if (data_queue.front() == 19) break; // 特殊情况:生产者已完成生产        int value = data_queue.front();        data_queue.pop();        std::cout << "Consumed: "<< value<< std::endl;        lock.unlock();        cond_var.notify_one(); // 通知生产者    }}int main() {    std::thread prod(producer);    std::thread cons(consumer);    prod.join();    cons.join();    return 0;}

在这个示例中,我们使用条件变量 cond_var 在生产者和消费者线程之间进行同步。生产者线程在队列未满时生产数据,并通知消费者线程。消费者线程在队列非空时消费数据,并通知生产者线程。

 
举报打赏
 
更多>同类网点查询
推荐图文
推荐网点查询
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号