condition_variable用于线程同步,配合mutex实现等待-通知机制,避免轮询。线程调用wait时释放锁并阻塞,直到notify唤醒;推荐使用带谓词的wait防止虚假唤醒。notify_one唤醒一个线程,notify_all唤醒所有,适用于生产者-消费者等场景。

在C++多线程编程中,condition_variable 是实现线程同步与等待机制的重要工具之一。它通常与 std::mutex 配合使用,用于让一个或多个线程等待某个特定条件成立后再继续执行。这种机制避免了轮询资源状态带来的性能浪费,提高了程序效率和响应性。
condition_variable 的基本概念
condition_variable(条件变量)本身并不存储状态,它只是一个通知机制。线程通过调用其 wait() 方法进入阻塞状态,直到其他线程调用 notify_one() 或 notify_all() 唤醒它。
关键点:
必须配合 std::unique_lock 使用,不能单独使用普通锁。 wait 操作会自动释放锁,并在被唤醒后重新获取锁。 常用于生产者-消费者模型、任务队列等场景。
基本用法示例
以下是一个典型的生产者-消费者例子,展示 condition_variable 如何协调线程间通信:
立即学习“C++免费学习笔记(深入)”;
#include #include #include #include #include std::queue data_queue;std::mutex mtx;std::condition_variable cv;bool finished = false;void producer() { for (int i = 0; i < 5; ++i) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); { std::lock_guard lock(mtx); data_queue.push(i); std::cout << "Produced: " << i << "n"; } cv.notify_one(); // 通知一个等待的消费者 } { std::lock_guard lock(mtx); finished = true; } cv.notify_one();}void consumer() { while (true) { std::unique_lock lock(mtx); // 等待条件:队列非空 或 生产结束 cv.wait(lock, []{ return !data_queue.empty() || finished; }); if (!data_queue.empty()) { int value = data_queue.front(); data_queue.pop(); std::cout << "Consumed: " << value << "n"; } if (data_queue.empty() && finished) { std::cout << "No more data. Exiting.n"; break; } // 自动释放锁并继续循环 }}
在这个例子中,消费者线程调用 cv.wait() 时会被挂起,直到生产者添加数据并调用 notify_one()。wait 内部使用 lambda 判断条件是否满足,只有当条件为假时才真正阻塞。
wait 的两种形式
condition_variable 提供了两个版本的 wait 函数:
wait(unique_lock& lock):无条件等待,需手动检查条件。 wait(unique_lock& lock, Predicate pred):接受一个可调用对象作为谓词,仅当 pred() 返回 false 时才阻塞。
推荐使用带谓词的版本,它可以防止因虚假唤醒(spurious wakeup)导致的问题,确保线程只在真正符合条件时才继续运行。
notify_one 与 notify_all 的区别
notify_one():唤醒至少一个正在等待的线程。适用于只有一个线程需要处理任务的情况,如单个消费者。 notify_all():唤醒所有等待中的线程。适合广播事件,比如资源已准备好,多个线程都可以继续工作。
注意:即使调用了 notify,等待线程也不会立即运行,因为它必须先重新获取互斥锁。
基本上就这些。掌握 condition_variable 的核心在于理解“等待-通知”模式以及如何安全地配合锁使用。只要注意保护共享数据、正确编写等待条件、及时发送通知,就能写出高效可靠的并发代码。
以上就是C++ condition_variable条件变量详解_C++线程同步与等待机制的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1489224.html
微信扫一扫
支付宝扫一扫