条件变量需配合互斥锁使用,通过wait()阻塞线程并释放锁,直到被notify_one()或notify_all()唤醒;利用谓词避免虚假唤醒,确保线程在条件满足时才继续执行。

在C++中,条件变量(std::condition_variable)是多线程编程中用于线程间同步的重要工具。它通常配合互斥锁(std::mutex)使用,允许某个线程等待特定条件成立,而另一个线程在条件满足时通知等待的线程继续执行。
包含头文件和基本组件
使用条件变量需要包含 和 头文件:
#include
#include
#include
#include iostream>
主要组件包括:
std::condition_variable:条件变量对象 std::mutex:保护共享数据的互斥锁 std::unique_lock:配合条件变量使用的锁类型
wait() 的使用方法
等待线程调用 wait() 会释放锁并进入阻塞状态,直到被其他线程唤醒。
立即学习“C++免费学习笔记(深入)”;
典型用法如下:
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
// 等待线程
std::unique_lock lock(mtx);
cv.wait(lock, []{ return ready; }); // 原子地释放锁并等待
这里传入一个 lambda 表达式作为谓词,确保只有当 ready == true 时才继续执行,避免虚假唤醒问题。
notify_one() 和 notify_all()
当条件满足时,通知线程调用 notify_one() 或 notify_all() 唤醒等待的线程。
// 通知线程
std::lock_guard lock(mtx);
ready = true;
cv.notify_one(); // 唤醒一个等待线程
如果多个线程在等待,notify_one() 只唤醒其中一个,notify_all() 唤醒所有等待线程。
完整示例:生产者-消费者模型
下面是一个简单的生产者-消费者例子:
#include stream>
#include
#include
#include
#include
std::queue data_queue;
std::mutex mtx;
std::condition_variable cv;
bool finished = false;
void consumer() {
std::unique_lock lock(mtx);
while (!finished) {
cv.wait(lock, [&]{ return !data_queue.empty() || finished; });
while (!data_queue.empty()) {
std::cout data_queue.pop();
}
}
}
void producer() {
for (int i = 0; i {
std::lock_guard lock(mtx);
data_queue.push(i);
}
cv.notify_one();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
{
std::lock_guard lock(mtx);
finished = true;
}
cv.notify_all();
}
int main() {
std::thread p(producer);
std::thread c(consumer);
p.join();
c.join();
return 0;
}
这个例子中,消费者等待数据队列非空或结束标志置位,生产者每产生一个数据就通知一次。
基本上就这些。关键是配合互斥锁使用,用谓词避免虚假唤醒,注意通知时机。不复杂但容易忽略细节。
以上就是c++++怎么使用条件变量condition_variable_c++ 条件变量使用方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1477028.html
微信扫一扫
支付宝扫一扫