admin管理员组文章数量:1599541
目录
介绍:
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;
}
通过使用条件变量,往任务队列中添加任务的线程和从任务队列中取出任务的线程可以有效地同步,避免了死锁和竞争条件的问题。同时,也避免了线程空转,减少了资源的浪费。
本文标签: stdconditionvariable
版权声明:本文标题:std::condition_variable 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728321751a1153914.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论