欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中std::condition_variable 條件變量的使用

 更新時間:2025年07月10日 09:39:17   作者:Ring__Rain  
std::condition_variable是C++多線程編程中用于線程間同步的核心工具,適用于需要協(xié)調(diào)多個線程行為、避免資源浪費(fèi)的場景,下面就來介紹一下std::condition_variable 條件變量的使用,

作用:std::condition_variable 是 C++ 多線程編程中用于線程間同步的核心工具,其使用場景和核心價值體現(xiàn)在以下幾個方面:        

一、何時使用 std::condition_variable?

  • ?線程需要等待特定條件成立當(dāng)某個線程必須等待共享資源的某個狀態(tài)(如隊列非空、任務(wù)完成、數(shù)據(jù)就緒等)時,使用條件變量可以避免忙等待(busy-waiting),從而減少 CPU 資源的浪費(fèi)。

    ?經(jīng)典場景
    • ?生產(chǎn)者-消費(fèi)者模型:消費(fèi)者線程等待隊列中有數(shù)據(jù)時,生產(chǎn)者線程在添加數(shù)據(jù)后通過 notify_one() 或 notify_all() 通知消費(fèi)者。
    • ?任務(wù)調(diào)度:工作線程等待任務(wù)隊列中出現(xiàn)新任務(wù)。
  • ?需要多線程協(xié)作完成復(fù)雜邏輯當(dāng)多個線程需要按特定順序協(xié)作時(如線程 A 完成預(yù)處理后通知線程 B 執(zhí)行),條件變量提供了一種高效的協(xié)調(diào)機(jī)制。

    ?示例:主線程等待所有子線程初始化完成后再啟動核心邏輯。
  • ?避免輪詢和資源浪費(fèi)若用 while (條件不滿足) { sleep(); } 實(shí)現(xiàn)等待,會導(dǎo)致線程頻繁切換上下文和無效輪詢,而條件變量通過阻塞線程直接釋放 CPU,直到被主動喚醒。

  • ?需要動態(tài)調(diào)整線程行為例如,線程池中的工作線程根據(jù)任務(wù)負(fù)載動態(tài)休眠或喚醒。

?二、為什么使用 std::condition_variable?

  • ?解決線程同步中的“等待-通知”問題條件變量通過 wait() 和 notify_*() 的組合,實(shí)現(xiàn)線程間的精準(zhǔn)通知機(jī)制:

    • wait():釋放互斥鎖并阻塞線程,允許其他線程操作共享資源。
    • ?notify_one()/notify_all():喚醒一個或所有等待線程,確保資源狀態(tài)變化后及時響應(yīng)。
  • ?避免虛假喚醒(Spurious Wakeup)?操作系統(tǒng)的底層實(shí)現(xiàn)可能導(dǎo)致線程被意外喚醒(即使未收到通知)。條件變量通過 ?謂詞(Predicate)? 參數(shù)(如 cv.wait(lock, []{ return ready; }))確保只有在條件真正滿足時才繼續(xù)執(zhí)行。

  • ?優(yōu)化鎖的粒度條件變量與 std::mutex 配合使用時,允許在等待期間釋放鎖,其他線程可繼續(xù)操作共享資源,避免長時間鎖競爭。

  • ?替代低效的輪詢機(jī)制相比輪詢(如 sleep() + 循環(huán)檢查),條件變量通過操作系統(tǒng)級的線程調(diào)度實(shí)現(xiàn)高效阻塞,減少 CPU 占用。

?三、使用示例與核心步驟

?基本流程

?定義共享變量和同步工具

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

?等待線程

std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return data_ready; });  // 阻塞直到 data_ready 為 true

?通知線程

{
    std::lock_guard<std::mutex> lock(mtx);
    data_ready = true;
}
cv.notify_one();  // 喚醒一個等待線程

?經(jīng)典案例:生產(chǎn)者-消費(fèi)者模型

#include <queue>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
std::queue<int> task_queue;

void producer() {
    for (int i = 0; i < 10; ++i) {
        {
            std::lock_guard<std::mutex> lock(mtx);
            task_queue.push(i);
        }
        cv.notify_one();  // 通知消費(fèi)者
    }
}

void consumer() {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return !task_queue.empty(); });  // 等待隊列非空
        int task = task_queue.front();
        task_queue.pop();
        lock.unlock();
        // 處理任務(wù)
    }
}

?四、注意事項

  • ?必須與互斥鎖配合使用
    所有對共享變量的修改和訪問必須通過互斥鎖保護(hù),否則會導(dǎo)致競態(tài)條件(Race Condition)。

  • ?正確處理虛假喚醒
    始終使用帶謂詞的 wait() 形式(如 cv.wait(lock, predicate))。

  • ?避免“喚醒丟失”?
    確保在修改共享狀態(tài)后調(diào)用 notify_*(),否則等待線程可能永遠(yuǎn)阻塞。

?總結(jié)

std::condition_variable 的核心價值在于通過 ?等待-通知機(jī)制 實(shí)現(xiàn)高效的線程同步,適用于需要協(xié)調(diào)多個線程行為、避免資源浪費(fèi)的場景。其設(shè)計解決了傳統(tǒng)輪詢的低效問題,并通過與互斥鎖的配合優(yōu)化了多線程程序的性能與安全性。

到此這篇關(guān)于C++中std::condition_variable 條件變量的使用的文章就介紹到這了,更多相關(guān)C++ std::condition_variable 條件變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法詳解

    C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法詳解

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法,結(jié)合實(shí)例形式分析了C++反轉(zhuǎn)鏈表的原理、實(shí)現(xiàn)方法及相關(guān)注意事項,需要的朋友可以參考下
    2017-08-08
  • C++中繼承基類與派生類的區(qū)別

    C++中繼承基類與派生類的區(qū)別

    這篇文章主要介紹了C++中繼承基類與派生類的區(qū)別,面向?qū)ο蟪绦蛟O(shè)計中最重要的一個概念是繼承。繼承允許我們依據(jù)另一個類來定義一個類,這使得創(chuàng)建和維護(hù)一個應(yīng)用程序變得更容易,需要的朋友可以參考下
    2023-05-05
  • C語言循環(huán)控制入門介紹

    C語言循環(huán)控制入門介紹

    大家好,本篇文章主要講的是C語言循環(huán)控制入門介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 純C語言實(shí)現(xiàn)火車售票系統(tǒng)

    純C語言實(shí)現(xiàn)火車售票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了純C語言實(shí)現(xiàn)火車售票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++ Virtual關(guān)鍵字的具體使用

    C++ Virtual關(guān)鍵字的具體使用

    這篇文章主要介紹了C++ Virtual關(guān)鍵字的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼

    vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼

    這篇文章主要介紹了vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-06-06
  • C語言銀行系統(tǒng)課程設(shè)計

    C語言銀行系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細(xì)介紹了C語言銀行系統(tǒng)課程設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言讀寫配置文件的方法

    C語言讀寫配置文件的方法

    這篇文章主要介紹了C語言讀寫配置文件的方法,包括C語言讀寫ini配置文件所涉及的文件讀寫技巧,以及完整的源文件及頭文件實(shí)現(xiàn)方法,需要的朋友可以參考下
    2015-07-07
  • C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問題

    C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問題

    這篇文章主要介紹了C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • ipv6實(shí)現(xiàn)tcp編程示例

    ipv6實(shí)現(xiàn)tcp編程示例

    這篇文章主要介紹了ipv6實(shí)現(xiàn)tcp編程示例,需要的朋友可以參考下
    2014-03-03

最新評論