std::condition_variable

目录

介绍:

std::condition_variable 类提供了两个主要的方法:

使用 std::condition_variable 的一般流程如下 :


介绍:

头文件 #include <condition_variable>

std::condition_variable 是 C++11 提供的一种线程同步原语,它可以用于在线程之间等待和通知事件的发生。

通常情况下,线程需要等待某个条件变量被满足后才能继续执行,这个等待的过程通常使用 std::unique_lock 和std::condition_variable 一起使用。


std::condition_variable 类提供了两个主要的方法:

        wait(lock):等待条件变量的通知,如果条件变量没有被满足,线程将被阻塞并释放关联的互斥锁 lock。当条件变量被满足时,线程会重新获取互斥锁并继续执行。

        notify_one() 或 notify_all():通知等待在条件变量上的线程条件已经被满足,等待的线程将被唤醒,继续执行。

使用 std::condition_variable 的一般流程如下 :

  • 首先定义一个互斥量(std::mutex)和一个条件变量(std::condition_variable),用来保证线程安全和线程之间的同步。
std::mutex _queueMutex;
std::condition_variable _queueCond;
  • 在往任务队列中添加任务时,需要先获取互斥锁,并检查队列是否已满。如果已满,则使用条件变量等待有空闲位置。
// 添加任务
void addTask(Task task) {
    // 获取互斥锁
    std::unique_lock<std::mutex> lock(_queueMutex);
    
    // 如果队列已满,则等待有空闲位置
    _queueCond.wait(lock, [this](){ return _taskQueue.size() < _maxQueueSize; });
    
    // 将任务添加到队列中
    _taskQueue.push_back(std::move(task));
}
  • 在从任务队列中取出任务时,也需要获取互斥锁,并检查队列是否为空。如果为空,则使用条件变量等待有任务可取。
// 取出任务
Task takeTask() {
    // 获取互斥锁
    std::unique_lock<std::mutex> lock(_queueMutex);
    
    // 如果队列为空,则等待有任务可取
    _queueCond.wait(lock, [this](){ return !_taskQueue.empty(); });
    
    // 从队列中取出一个任务
    Task task = std::move(_taskQueue.front());
    _taskQueue.pop_front();
    
    return task;
}

通过使用条件变量,往任务队列中添加任务的线程和从任务队列中取出任务的线程可以有效地同步,避免了死锁和竞争条件的问题。同时,也避免了线程空转,减少了资源的浪费。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值