std::condition_variable用于线程同步,配合mutex和共享变量实现高效等待与通知机制,如生产者-消费者模型中通过wait()和notify_one()协调线程,避免轮询并处理虚假唤醒。

在C++多线程编程中,std::condition_variable 是一种重要的同步机制,用于线程间的通信与等待。它通常配合 std::unique_lock<:mutex> 使用,实现一个线程等待某个条件成立,而另一个线程在条件达成时通知等待中的线程继续执行。
条件变量允许线程**主动挂起**,直到接收到“条件已满足”的信号。这种机制避免了轮询检查共享状态,提高了效率和响应性。
典型使用场景包括:
使用 std::condition_variable 需要三个核心部分:
立即学习“C++免费学习笔记(深入)”;
标准使用流程如下:
下面是一个简单的例子,展示两个线程通过条件变量协作:
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> 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::unique_lock<std::mutex> lock(mtx);
data_queue.push(i);
std::cout << "生产: " << i << "\n";
lock.unlock();
cv.notify_one(); // 通知消费者
}
{
std::unique_lock<std::mutex> lock(mtx);
finished = true;
}
cv.notify_one(); // 通知消费者生产结束
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
// 等待队列非空或生产结束
cv.wait(lock, [] { return !data_queue.empty() || finished; });
if (!data_queue.empty()) {
int value = data_queue.front();
data_queue.pop();
std::cout << "消费: " << value << "\n";
}
if (data_queue.empty() && finished) {
break; // 结束循环
}
lock.unlock();
}
std::cout << "消费者退出\n";
}
int main() {
std::thread p(producer);
std::thread c(consumer);
p.join();
c.join();
return 0;
}
说明:
使用条件变量时需注意以下几点:
以上就是c++++怎么使用条件变量std::condition_variable_c++线程通信与等待机制的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号