C++中的條件變量(condition variable)是一種同步原語,它允許線程等待某個(gè)條件成立,同時(shí)釋放互斥鎖(mutex),讓其他線程繼續(xù)執(zhí)行
避免忙等待:在沒有條件變量的情況下,線程可能會(huì)不斷地檢查條件是否滿足,這會(huì)導(dǎo)致CPU資源的浪費(fèi)。通過使用條件變量,線程可以在條件不滿足時(shí)進(jìn)入阻塞狀態(tài),當(dāng)條件滿足時(shí)被喚醒,從而避免了忙等待。
減少鎖競爭:條件變量通常與互斥鎖一起使用,以確保在檢查條件和等待通知時(shí)不會(huì)發(fā)生數(shù)據(jù)競爭。當(dāng)一個(gè)線程等待條件變量時(shí),其他線程可以繼續(xù)執(zhí)行,從而減少了鎖競爭,提高了程序的執(zhí)行效率。
提高響應(yīng)速度:通過使用條件變量,線程可以在條件滿足時(shí)立即收到通知,而不需要不斷地檢查條件。這可以提高程序的響應(yīng)速度,特別是在處理I/O操作、事件驅(qū)動(dòng)等場景中。
簡化線程同步:條件變量提供了一種簡單的方法來實(shí)現(xiàn)線程間的同步,使得程序員可以更容易地編寫并發(fā)代碼。通過使用條件變量,程序員可以避免復(fù)雜的鎖管理和死鎖等問題,從而提高程序的可維護(hù)性。
下面是一個(gè)簡單的C++條件變量示例:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id(int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) { // 如果ready為false,則等待條件變量
cv.wait(lck); // 當(dāng)條件變量滿足時(shí),自動(dòng)釋放鎖并喚醒線程
}
std::cout << "thread " << id << '\n';
}
void go() {
std::this_thread::sleep_for(std::chrono::seconds(1)); // 讓主線程先執(zhí)行一段時(shí)間
{
std::lock_guard<std::mutex> lck(mtx);
ready = true; // 修改共享變量,使其滿足條件
}
cv.notify_all(); // 喚醒所有等待的線程
}
int main() {
std::thread threads[10];
// spawn 10 threads:
for (int i = 0; i < 10; ++i)
threads[i] = std::thread(print_id, i);
std::cout << "10 threads ready to race...\n";
go(); // go!
for (auto &th : threads) th.join();
return 0;
}
在這個(gè)示例中,我們創(chuàng)建了10個(gè)線程,它們都在等待一個(gè)條件(ready
變量)。主線程在修改ready
變量后,通過條件變量通知所有等待的線程。這樣,我們可以看到,使用條件變量可以避免忙等待,提高程序的執(zhí)行效率。