std::condition_variable
的步骤如下:
-
创建一个
std::condition_variable
对象。 -
创建一个互斥锁
std::mutex
对象,用来保护共享资源的访问。 -
在需要等待条件变量的地方
使用
std::unique_lock<std::mutex>
对象锁定互斥锁并调用
std::condition_variable::wait()
、std::condition_variable::wait_for()
或std::condition_variable::wait_until()
函数等待条件变量。 -
在其他线程中需要通知等待的线程时,调用
std::condition_variable::notify_one()
或std::condition_variable::notify_all()
函数通知等待的线程。
生产者与消费者模型
下面是一个简单的生产者-消费者模型的案例,其中使用了 `std::condition_variable` 来实现线程的等待和通知机制:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex g_mutex;
std::condition_variable g_cv;
std::queue<int> g_queue;
void Producer() {
for (int i = 0; i < 10; i++) {
{
std::unique_lock<std::mutex> lock(g_mutex);
g_queue.push(i);
std::cout << "Producer: produced " << i << std::endl;
}
g_cv.notify_one();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
void Consumer() {
while (true) {
std::unique_lock<std::mutex> lock(g_mutex);
g_cv.wait(lock, []() { return !g_queue.empty(); });
int value = g_queue.front();
g_queue.pop();
std::cout << "Consumer: consumed " << value << std::endl;
}
}
int main() {
std::thread producer_thread(Producer);
std::thread consumer_thread(Consumer);
producer_thread.join();
consumer_thread.join();
return 0;
}
使用 `std::condition_variable` 可以实现线程的等待和通知机制,从而在多线程环境中实现同步操作。在生产者-消费者模型中,使用 `std::condition_variable` 可以让消费者线程等待生产者线程生产数据后再进行消费,避免了数据丢失或者数据不一致的问题。