C++17 std::condition_variable用法详解
std::condition_variable 是 C++ 标准库提供的一种线程同步原语,用于在多个线程之间进行通信和协调。它通常与 std::mutex 一起使用,用于实现线程间的等待和通知机制。
## 等待
调用 wait(lock, pred) 方法来等待条件变量。其中 lock 是一个std::unique_lock<std::mutex>对象,pred 是一个可调用对象(函数或者lambda表达式),用于检查等待条件是否满足。
当调用 wait 后,线程会释放锁并进入阻塞状态,直到其他某个线程调用 notify_one 或 notify_all 方法唤醒它。
## 通知
调用 notify_one 方法来唤醒一个等待的线程。
调用 notify_all 方法来唤醒所有等待的线程。
#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>
std::mutex mtx;
std::condition_variable cv;
bool dataReady = false;
void waitingForData() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return dataReady; });
std::cout << "Data is ready!" << std::endl;
}
void prepareData() {
std::this_thread::sleep_for(std::chrono::seconds(2));
{
std::lock_guard<std::mutex> lock(mtx);
dataReady = true;
}
cv.notify_one();
}
int main() {
std::thread dataPreparationThread(prepareData);
std::thread dataProcessingThread(waitingForData);
dataPreparationThread.join();
dataProcessingThread.join();
return 0;
}
在上面的示例中:
prepareData 函数负责准备数据,并在数据准备完毕后发送信号;
waitingForData 函数等待数据准备完毕的信号。
通过 std::condition_variable 实现了两个线程之间的协调与通信