亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

c++如何使用條件變量(condition_variable)實現(xiàn)同步 _c++條件變量同步方法

下次還敢
發(fā)布: 2025-10-15 18:28:01
原創(chuàng)
892人瀏覽過
條件變量用于線程同步,需配合互斥鎖使用。包含頭文件<condition_variable>和<mutex>,通過wait()等待條件滿足,并自動釋放和重新獲取鎖;另一線程修改共享狀態(tài)后調(diào)用notify_one()或notify_all()喚醒等待線程。示例中生產(chǎn)者-消費(fèi)者模型利用條件變量實現(xiàn)安全的數(shù)據(jù)傳遞,避免忙等,提升效率。

c++如何使用條件變量(condition_variable)實現(xiàn)同步 _c++條件變量同步方法

在C++多線程編程中,condition_variable(條件變量)常用于線程間的同步,使某個線程等待特定條件成立后再繼續(xù)執(zhí)行。它通常與std::mutex配合使用,避免忙等,提高效率。

基本用法和頭文件

要使用條件變量,需包含頭文件:

#include <condition_variable>
#include <mutex>
#include <thread>

核心組件包括:
- std::condition_variable:用于阻塞或喚醒線程。
- std::mutexstd::unique_lock<std::mutex>:保護(hù)共享數(shù)據(jù)并配合條件變量使用。

等待條件成立

一個線程可以調(diào)用 wait() 方法等待某個條件滿足。wait() 會自動釋放鎖,并在被喚醒后重新獲取鎖。

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

// 等待線程
std::thread waiting_thread([&]() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; }); // 等待 ready 為 true
// 條件滿足,繼續(xù)執(zhí)行
std::cout << "繼續(xù)執(zhí)行..." << std::endl;
});

說明:
- 傳入 lambda 表達(dá)式作為謂詞,可防止虛假喚醒。
- wait 期間 mutex 被釋放,其他線程可訪問共享數(shù)據(jù)。

通知等待的線程

當(dāng)條件達(dá)成時,另一線程通過 notify_one() 或 notify_all() 喚醒等待線程。

立即學(xué)習(xí)C++免費(fèi)學(xué)習(xí)筆記(深入)”;

商湯商量
商湯商量

商湯科技研發(fā)的AI對話工具,商量商量,都能解決。

商湯商量36
查看詳情 商湯商量
// 通知線程
std::thread notifying_thread([&]() {
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // 喚醒一個等待線程
// cv.notify_all(); // 喚醒所有等待線程
});

注意:修改共享變量時必須加鎖,確保原子性。

完整示例:生產(chǎn)者-消費(fèi)者模型

演示兩個線程通過條件變量同步操作共享隊列。

#include <iostream>
#include <thread>
#include <queue>
#include <condition_variable>
#include <mutex>

std::queue<int> data_queue;
std::mutex mtx;
std::condition_variable cv;
bool finished = false;

void consumer() {
std::unique_lock<std::mutex> lock(mtx);
while (!finished || !data_queue.empty()) {
cv.wait(lock, [&]{ return finished || !data_queue.empty(); });
while (!data_queue.empty()) {
int value = data_queue.front();
data_queue.pop();
std::cout << "消費(fèi): " << value << std::endl;
}
}
}

void producer() {
for (int i = 1; i <= 5; ++i) {
{
std::lock_guard<std::mutex> lock(mtx);
data_queue.push(i);
}
cv.notify_one();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
{
std::lock_guard<std::mutex> lock(mtx);
finished = true;
}
cv.notify_all();
}

int main() {
std::thread p(producer);
std::thread c(consumer);
p.join();
c.join();
return 0;
}

該例子中,消費(fèi)者等待數(shù)據(jù)就緒,生產(chǎn)者推送數(shù)據(jù)并通知,實現(xiàn)安全同步。

基本上就這些。合理使用 condition_variable 可以高效協(xié)調(diào)線程,但要注意配合互斥鎖、避免虛假喚醒、正確管理共享狀態(tài)。不復(fù)雜但容易忽略細(xì)節(jié)。

以上就是c++++如何使用條件變量(condition_variable)實現(xiàn)同步 _c++條件變量同步方法的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

相關(guān)標(biāo)簽:
c++速學(xué)教程(入門到精通)
c++速學(xué)教程(入門到精通)

c++怎么學(xué)習(xí)?c++怎么入門?c++在哪學(xué)?c++怎么學(xué)才快?不用擔(dān)心,這里為大家提供了c++速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號