std::condition_variable用于线程同步,需与std::mutex配合使用,通过wait()等待条件,notify_one()/notify_all()通知;必须在锁保护下等待,推荐带谓词的wait防止虚假唤醒,通知前应先修改共享数据并释放锁。

在C++多线程编程中,std::condition_variable 是实现线程间条件同步的重要工具。它通常与 std::mutex 配合使用,用于让一个或多个线程等待某个特定条件成立后再继续执行。
条件变量本身不存储状态,它只是一个通知机制。线程可以:
关键点是:等待必须在互斥锁保护下进行,且通常使用循环检查条件,防止虚假唤醒。
以下是使用 std::condition_variable 的标准模式:
立即学习“C++免费学习笔记(深入)”;
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker_thread() {
std::unique_lock<std::mutex> lock(mtx);
// 等待直到 ready 为 true
cv.wait(lock, []{ return ready; });
std::cout << "工作线程开始执行任务\n";
}
int main() {
std::thread worker(worker_thread);
std::this_thread::sleep_for(std::chrono::seconds(1));
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // 唤醒一个等待的线程
worker.join();
return 0;
}
cv.wait(lock):无条件等待,醒来后需手动检查条件。
cv.wait(lock, predicate):带条件的等待,等价于:
while (!predicate()) {
wait(lock);
}
推荐使用带谓词的版本,能自动处理虚假唤醒。
注意:通知前应先修改共享数据并释放锁,否则被唤醒的线程可能无法立即获取锁。
常见应用场景:用条件变量实现线程安全的任务队列。
#include <queue>
#include <thread>
#include <condition_variable>
std::queue<int> tasks;
std::mutex task_mutex;
std::condition_variable task_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<std::mutex> lock(task_mutex);
tasks.push(i);
std::cout << "生产任务: " << i << "\n";
task_cv.notify_one();
}
{
std::lock_guard<std::mutex> lock(task_mutex);
finished = true;
}
task_cv.notify_all(); // 通知消费者结束
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(task_mutex);
task_cv.wait(lock, []{ return !tasks.empty() || finished; });
if (finished && tasks.empty()) break;
int task = tasks.front();
tasks.pop();
lock.unlock(); // 处理任务时不持有锁
std::cout << "消费任务: " << task << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
}
以上就是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号