在 C++ 中,std::condition_variable
類提供了一種條件變量,可以用于線程間的同步。它常與 std::mutex
和 std::unique_lock
或 std::lock_guard
結合使用。
當一個線程需要等待另一個線程完成某個操作時,可以使用條件變量。這里有兩個主要的函數:wait()
和 notify_one()
/ notify_all()
。
wait()
: 當一個線程調用 cond_var.wait(lock, [&](){ return condition; })
時,該線程會釋放鎖并等待條件變量 cond_var
被通知。一旦收到通知,線程將重新獲取鎖并檢查條件是否滿足。如果條件滿足,則繼續執行;否則,線程將再次等待通知。notify_one()
/ notify_all()
: 當另一個線程完成操作并更改條件時,它可以調用 cond_var.notify_one()
或 cond_var.notify_all()
來通知等待的線程。notify_one()
只喚醒一個等待的線程,而 notify_all()
喚醒所有等待的線程。下面是一個簡單的示例,展示了如何使用條件變量實現生產者-消費者模型:
#include<iostream>
#include<thread>
#include<queue>
#include <mutex>
#include<condition_variable>
std::queue<int> data_queue;
std::mutex mtx;
std::condition_variable cond_var;
const int max_queue_size = 5;
void producer() {
for (int i = 0; i < 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
cond_var.wait(lock, [] { return data_queue.size() < max_queue_size; }); // 等待隊列未滿
data_queue.push(i);
std::cout << "Produced: " << i << std::endl;
lock.unlock();
cond_var.notify_one(); // 通知消費者
}
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cond_var.wait(lock, [] { return !data_queue.empty(); }); // 等待隊列非空
if (data_queue.front() == 19) break; // 特殊情況:生產者已完成生產
int value = data_queue.front();
data_queue.pop();
std::cout << "Consumed: "<< value<< std::endl;
lock.unlock();
cond_var.notify_one(); // 通知生產者
}
}
int main() {
std::thread prod(producer);
std::thread cons(consumer);
prod.join();
cons.join();
return 0;
}
在這個示例中,我們使用條件變量 cond_var
在生產者和消費者線程之間進行同步。生產者線程在隊列未滿時生產數據,并通知消費者線程。消費者線程在隊列非空時消費數據,并通知生產者線程。