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

在C++中,条件变量(std::condition_variable)是多线程编程中用于线程间同步的重要工具。它通常配合互斥锁(std::mutex)使用,允许某个线程等待特定条件成立,而另一个线程在条件满足时通知等待的线程继续执行。
包含头文件和基本组件
使用条件变量需要包含 和 头文件:
#include
#include
#include iostream>
主要组件包括:
-
std::condition_variable:条件变量对象 -
std::mutex:保护共享数据的互斥锁 -
std::unique_lock<:mutex>:配合条件变量使用的锁类型
wait() 的使用方法
等待线程调用 wait() 会释放锁并进入阻塞状态,直到被其他线程唤醒。
立即学习“C++免费学习笔记(深入)”;
典型用法如下:
std::mutex mtx;std::condition_variable cv;
bool ready = false;
// 等待线程
std::unique_lock<:mutex> lock(mtx);
cv.wait(lock, []{ return ready; }); // 原子地释放锁并等待
这里传入一个 lambda 表达式作为谓词,确保只有当 ready == true 时才继续执行,避免虚假唤醒问题。
经过数月的努力,纵横B2B V3.0正式发布。感谢所有用户的大力支持和耐心等待,升级过程中提出了众多有价值的功能建议,向他们致敬。本次升级直接跨越到3.0版本,意味着将会带来很多新的变化。首先最大的变化是用户中心,我们借鉴了大量SNS社区、WEB2.0网站的概念,增强了交互性和可操作性;其次彻底抛弃了关键词竞价模式,改为直接购买关键词,为网站带来直接收益创造了条件;对系统性能进行了大量改进,使得系
notify_one() 和 notify_all()
当条件满足时,通知线程调用 notify_one() 或 notify_all() 唤醒等待的线程。
std::lock_guard<:mutex> lock(mtx);
ready = true;
cv.notify_one(); // 唤醒一个等待线程
如果多个线程在等待,notify_one() 只唤醒其中一个,notify_all() 唤醒所有等待线程。
完整示例:生产者-消费者模型
下面是一个简单的生产者-消费者例子:
#include#include
#include
#include
#include
std::queue
std::mutex mtx;
std::condition_variable cv;
bool finished = false;
void consumer() {
std::unique_lock<:mutex> 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<:mutex> lock(mtx);
data_queue.push(i);
}
cv.notify_one();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
{
std::lock_guard<:mutex> lock(mtx);
finished = true;
}
cv.notify_all();
}
int main() {
std::thread p(producer);
std::thread c(consumer);
p.join();
c.join();
return 0;
}
这个例子中,消费者等待数据队列非空或结束标志置位,生产者每产生一个数据就通知一次。
基本上就这些。关键是配合互斥锁使用,用谓词避免虚假唤醒,注意通知时机。不复杂但容易忽略细节。










