精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++11 鎖機制三兄弟大比拼:mutex、lock_guard 與 unique_lock

開發(fā)
今天我要用最接地氣的方式,幫你徹底搞懂 C++11 中的三兄弟:mutex、lock_guard和unique_lock。

大家好啊,我是小康。今天咱們聊點"家常"——那些讓C++程序員又愛又恨的多線程同步工具!

如果你曾經(jīng)被多線程搞得頭大,或者聽到"死鎖"就心慌,那這篇文章就是為你準備的。今天我要用最接地氣的方式,幫你徹底搞懂C++11中的三兄弟:mutex、lock_guard和unique_lock。

為啥要用這些同步工具?

先別急著學怎么用,咱們得先知道為啥要用??!

想象一下:你和室友共用一個衛(wèi)生間。如果你們同時沖進去...嗯,畫面太美不敢想象。所以你們會怎么做?肯定是先看看有沒有人,沒人才進去,然后反鎖門,用完了再開門。

多線程程序也一樣!不同的線程可能會同時訪問同一塊"地盤"(共享資源),如果不加控制,就會出現(xiàn)數(shù)據(jù)錯亂、程序崩潰等一系列災難。

這時候,我們的三兄弟就閃亮登場了!

老大:mutex(互斥鎖)

mutex就像那個衛(wèi)生間的門鎖,它是最基礎的同步工具,核心功能就兩個:鎖上(lock)和開鎖(unlock)。

來看個最簡單的例子:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;  // 這就是我們的"門鎖"
int shared_value = 0;  // 這是我們要保護的"衛(wèi)生間"

void increment_value() {
    mtx.lock();  // 進去之前先鎖門
    std::cout << "線程 " << std::this_thread::get_id() << " 進入臨界區(qū)" << std::endl;
    
    // 想象這是個很復雜的操作,需要一些時間
    shared_value++;
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    
    std::cout << "線程 " << std::this_thread::get_id() << " 即將離開,共享值為: " << shared_value << std::endl;
    mtx.unlock();  // 用完了記得開鎖,讓別人能進來
}

int main() {
    std::thread t1(increment_value);
    std::thread t2(increment_value);
    
    t1.join();
    t2.join();
    
    return 0;
}

看著挺簡單對吧?但這有個大坑——如果在lock和unlock之間發(fā)生了異常,或者你單純忘記了unlock,那么鎖就永遠不會被釋放,其他線程永遠進不了"衛(wèi)生間"!這就是傳說中的"死鎖"。

正因如此,直接使用mutex很容易出錯,所以C++11給我們提供了更智能的解決方案。

老二:lock_guard(保安大哥)

lock_guard就像一個靠譜的保安大哥。當你進"衛(wèi)生間"時,他會自動鎖門;當你出來時,無論是正常出來還是因為突發(fā)情況(異常)跑出來,他都會負責解鎖。

看看用lock_guard如何改寫上面的例子:

void safer_increment() {
    std::lock_guard<std::mutex> guard(mtx);  // 保安上崗,自動鎖門
    
    std::cout << "線程 " << std::this_thread::get_id() << " 進入臨界區(qū)" << std::endl;
    
    // 即使這里拋出異常,離開函數(shù)作用域時lock_guard也會自動解鎖
    shared_value++;
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    
    std::cout << "線程 " << std::this_thread::get_id() << " 即將離開,共享值為: " << shared_value << std::endl;
    
    // 不需要手動解鎖,guard離開作用域時會自動解鎖
}

是不是簡單多了?這就是RAII(資源獲取即初始化)的魅力——資源的管理跟對象的生命周期綁定在一起。lock_guard一旦創(chuàng)建就會鎖定互斥量,一旦銷毀(離開作用域)就會解鎖互斥量。

不過lock_guard有個局限性:一旦上鎖,在其生命周期內你就不能手動解鎖了。就像你請了個特別死板的保安,他堅持要等你徹底離開才會開門,中途想出去透個氣都不行。

老三:unique_lock(萬能管家)

如果說lock_guard是保安大哥,那unique_lock就是一個高級管家,不但能自動鎖門解鎖,還能根據(jù)你的指令隨時鎖門或開門,甚至可以"借"鑰匙給別人。

來看個例子:

void flexible_operation() {
    std::unique_lock<std::mutex> superlock(mtx);  // 默認情況下構造時會鎖定mutex
    
    std::cout << "線程 " << std::this_thread::get_id() << " 開始工作" << std::endl;
    shared_value++;
    
    // 假設這里不需要鎖了,可以提前解鎖
    superlock.unlock();
    std::cout << "臨時解鎖,執(zhí)行一些不需要保護的操作" << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(50));
    
    // 需要再次訪問共享資源時,可以重新上鎖
    superlock.lock();
    shared_value++;
    std::cout << "線程 " << std::this_thread::get_id() << " 完成工作,共享值為: " << shared_value << std::endl;
    
    // 同樣,不需要手動解鎖,離開作用域時會自動解鎖(如果當時處于鎖定狀態(tài))
}

除了手動lock和unlock,unique_lock還有更多高級功能:

std::unique_lock<std::mutex> master_lock(mtx, std::defer_lock);  // 創(chuàng)建時不鎖定
if (master_lock.try_lock()) {  // 嘗試鎖定,如果失敗也不會阻塞
    std::cout << "成功獲取鎖!" << std::endl;
} else {
    std::cout << "獲取鎖失敗,但我可以去做別的事" << std::endl;
}

// 還可以配合條件變量使用
std::condition_variable cv;
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; });  // 這里會自動解鎖并等待條件滿足

unique_lock比lock_guard靈活,但也付出了一點性能代價,它內部需要維護更多狀態(tài)信息。

三兄弟大比拼

說了這么多,來個簡單對比:

特性

mutex

lock_guard

unique_lock

手動鎖定/解鎖

?

?

?

異常安全

?(需手動保證)

?

?

條件變量配合

?

?

?

嘗試鎖定(try_lock)

?

?

?

性能開銷

最小

很小

稍大

使用難度

容易出錯

簡單安全

靈活但復雜

實戰(zhàn):模擬ATM取款與系統(tǒng)維護

最后用一個貼近生活的例子來鞏固一下。假設我們有個ATM系統(tǒng),既要處理用戶取款,又要處理銀行的系統(tǒng)維護:

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

class ATMSystem {
private:
    double cash_available;  // ATM中可用現(xiàn)金
    bool maintenance_mode;  // 是否處于維護模式
    std::mutex mtx;
    std::condition_variable cv;  // 條件變量,用于等待維護結束

public:
    ATMSystem(double initial_cash) : cash_available(initial_cash), maintenance_mode(false) {}
    
    // 用戶取款操作
    bool withdraw(double amount) {
        // 這里必須用unique_lock,因為條件變量wait需要它
        std::unique_lock<std::mutex> lock(mtx);
        
        // 如果ATM正在維護中,等待維護結束
        cv.wait(lock, [this] { return !maintenance_mode; });
        
        // 檢查余額并取款
        if (cash_available >= amount) {
            std::this_thread::sleep_for(std::chrono::milliseconds(50));
            cash_available -= amount;
            std::cout << "取出: " << amount << ",ATM剩余現(xiàn)金: " << cash_available << std::endl;
            return true;
        }
        
        std::cout << "ATM現(xiàn)金不足,取款失?。‘斍笆S? " << cash_available << std::endl;
        return false;
    }
    
    // 開始系統(tǒng)維護
    void start_maintenance() {
        std::lock_guard<std::mutex> guard(mtx);
        maintenance_mode = true;
        std::cout << "ATM進入維護模式,暫停服務" << std::endl;
    }
    
    // 結束系統(tǒng)維護
    void end_maintenance() {
        {
            std::lock_guard<std::mutex> guard(mtx);
            maintenance_mode = false;
            std::cout << "ATM維護完成,恢復服務" << std::endl;
        }
        // 通知所有等待的取款線程
        cv.notify_all();
    }
    
    // 補充現(xiàn)金
    void refill_cash(double amount) {
        std::lock_guard<std::mutex> guard(mtx);
        cash_available += amount;
        std::cout << "ATM補充現(xiàn)金: " << amount << ",當前總現(xiàn)金: " << cash_available << std::endl;
    }
};

// 模擬用戶線程
void user_thread(ATMSystem& atm, int user_id) {
    std::cout << "用戶 " << user_id << " 嘗試取款..." << std::endl;
    atm.withdraw(100);
}

// 模擬維護線程
void maintenance_thread(ATMSystem& atm) {
    std::this_thread::sleep_for(std::chrono::milliseconds(20));
    atm.start_maintenance();
    
    // 執(zhí)行維護操作
    std::this_thread::sleep_for(std::chrono::milliseconds(300));
    atm.refill_cash(500);
    
    // 維護結束
    atm.end_maintenance();
}

int main() {
    ATMSystem atm(300);  // 初始現(xiàn)金300元
    
    // 啟動一個維護線程和多個用戶線程
    std::thread maint(maintenance_thread, std::ref(atm));
    
    std::vector<std::thread> users;
    for (int i = 1; i <= 5; ++i) {
        users.push_back(std::thread(user_thread, std::ref(atm), i));
    }
    
    // 等待所有線程結束
    maint.join();
    for (auto& t : users) {
        t.join();
    }
    
    return 0;
}

總結

  • mutex:最基礎的鎖,需要手動鎖定和解鎖,用不好容易出問題,就像自己管理衛(wèi)生間門鎖。
  • lock_guard:簡單安全的自動鎖,構造時鎖定,析構時解鎖,但不能中途操作鎖狀態(tài),就像請了個死板但可靠的保安。
  • unique_lock:功能最全面的鎖包裝器,靈活性最高,但有輕微的性能開銷,就像一個萬能的管家。

優(yōu)秀實踐:

  • 簡單場景,優(yōu)先使用lock_guard
  • 需要條件變量或靈活鎖定/解鎖時,使用unique_lock
  • 對性能極度敏感的場景,考慮直接使用mutex,但要非常小心

希望這篇文章能讓你對C++11的同步工具有個清晰的認識。多線程不再可怕,熟練掌握這"三兄弟",你就能寫出安全高效的并發(fā)程序啦!

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2023-05-26 15:53:48

MidjourneyAI圖像

2019-08-27 09:00:00

敏捷開發(fā)開發(fā)方法項目

2010-04-21 12:54:46

Unix內核

2009-10-13 14:46:00

思科認證

2011-01-19 11:10:30

2010-03-18 14:54:46

主流無線技術

2009-07-02 18:50:43

2010-07-14 13:38:51

Perl開發(fā)工具

2020-08-04 17:06:40

Merging Rebasing Git

2011-11-28 12:55:37

JavaJVM

2017-09-10 14:29:03

眼力

2010-05-28 11:09:51

SVN功能

2014-01-07 17:08:02

Java開源框架

2021-03-15 21:07:17

IT行業(yè)薪酬薪水

2011-11-08 10:29:44

2010-09-08 15:41:28

SIP協(xié)議棧

2010-08-25 16:12:34

職場

2016-11-02 09:20:01

SparkHadoop MapR大數(shù)據(jù)

2011-08-18 11:08:02

2019-11-21 09:39:30

EMonitorCAT監(jiān)控
點贊
收藏

51CTO技術棧公眾號

综合av色偷偷网| 国产精品久久久久久久午夜片| 日韩视频精品在线| 岛国大片在线免费观看| 国产极品人妖在线观看| 久久亚洲一级片| 成人免费视频97| 欧美毛片在线观看| 亚洲97av| 日韩无一区二区| 免费裸体美女网站| 4438x成人网全国最大| 91免费观看视频在线| 国产欧美日韩视频| www.国产色| 一区二区三区午夜视频| 日韩精品免费一线在线观看| 香港日本韩国三级网站| heyzo高清国产精品| 中文一区二区在线观看| 国产精品一区二区免费看| 日本视频www色| 亚洲成人直播| 久久久www成人免费精品| 欧美高清性xxxx| 日韩三级网址| 精品视频一区二区不卡| 黄色av网址在线播放| 国产区在线观看| 亚洲国产成人在线| 精品无人区一区二区三区竹菊 | 亚洲一区欧美二区| 久久影院资源网| 免费看黄色av| 牛牛影视久久网| 欧美成人午夜电影| 成人av毛片在线观看| 色成人免费网站| 欧美日韩美女在线观看| www插插插无码免费视频网站| 中文字幕日本在线观看| 久久久久久久久久看片| 久久久久久国产精品免费免费| www.黄色av| 国产乱对白刺激视频不卡| 国产精品丝袜久久久久久高清 | 美女主播视频一区| 天天操天天操天天| 不卡欧美aaaaa| 国产一区二区三区奇米久涩| 国产综合在线播放| 成人av电影在线网| 国产亚洲欧美一区二区| 国内爆初菊对白视频| 风流少妇一区二区| 成人欧美视频在线| 日韩一级中文字幕| 99久久国产免费看| 免费av在线一区二区| 色中色在线视频| 久久色成人在线| 另类欧美小说| 国产人成在线视频| 国产精品三级电影| 在线观看免费黄色片| 99热国产在线中文| 性久久久久久久| 欧美精品99久久| 性欧美1819sex性高清| 欧美亚洲一区三区| 亚洲精品在线视频播放| 深夜激情久久| 亚洲精品美女在线观看播放| 97超碰在线免费观看| 精品免费一区二区| 久久精品亚洲94久久精品| 午夜69成人做爰视频| 一区在线视频观看| 欧美中文字幕精品| 中文字幕+乱码+中文字幕明步 | 91久久视频| 日本精品免费观看| 亚洲性在线观看| 国产91丝袜在线播放九色| 久久久久久九九| 91在线品视觉盛宴免费| 一区二区三区久久久| 日韩精品视频一区二区在线观看| 日韩毛片在线| 欧美zozo另类异族| 国产三级av在线播放| 亚洲91中文字幕无线码三区| 性欧美视频videos6一9| 最近中文字幕在线观看| 国产99久久久精品| 日本一区二区三区四区在线观看| 人人干在线视频| 亚洲h精品动漫在线观看| 99久久国产宗和精品1上映| 成人自拍视频| 亚洲欧美在线磁力| 日本福利片在线观看| 国产亚洲福利| 亚洲精品免费在线视频| 美州a亚洲一视本频v色道| 亚洲春色h网| 最近中文字幕2019免费| 久久精品久久国产| 日本不卡的三区四区五区| 亚洲永久免费观看| 成全电影播放在线观看国语| 亚洲一区二区中文在线| 亚洲天堂av线| 久久夜色电影| 麻豆成人在线看| 久久久久久久久久一级| 粉嫩嫩av羞羞动漫久久久| 亚洲激情一区二区三区| 性xxxxfreexxxxx欧美丶| 日韩一区二区三区电影在线观看| 四虎影成人精品a片| 欧美日本不卡高清| 成人激情电影一区二区| 玖玖综合伊人| 亚洲成人免费观看| 亚洲制服在线观看| 日韩av自拍| 国产成人精品视频在线观看| 神马午夜在线观看| 一区二区免费在线| 两性午夜免费视频| 色777狠狠狠综合伊人| 国产91免费看片| 天堂在线视频观看| 亚洲国产美国国产综合一区二区| 亚洲在线观看网站| 久久久国产精品| 国产精品永久在线| av网站在线免费播放| 日本黄色一区二区| 37p粉嫩大胆色噜噜噜| www.色视频| 蜜桃av一区二区三区| 鲁鲁视频www一区二区| aaa在线播放视频| 欧美精品一区二区蜜臀亚洲| 欧美另类视频在线观看| 国产乱色国产精品免费视频| 超碰在线免费观看97| 久久福利在线| 日韩日本欧美亚洲| 91精品国产乱码久久久久| 国产精品天干天干在观线| 四季av一区二区| 精品久久一区| 国产日韩专区在线| 毛片在线看网站| 4438x成人网最大色成网站| 久草福利资源在线| 国产精品99久久久久| 国产人妻人伦精品| 成人高潮视频| 91av在线看| 国产日产精品久久久久久婷婷| 欧美午夜在线一二页| eeuss中文字幕| 国产乱人伦精品一区二区在线观看 | 91在线视频免费播放| 国产午夜亚洲精品午夜鲁丝片| 别急慢慢来1978如如2| 99九九热只有国产精品| 999热视频| 美女91在线看| 精品国产91久久久久久老师| 北京富婆泄欲对白| 免费久久99精品国产自在现线| 欧美一卡2卡3卡4卡无卡免费观看水多多| 国产另类xxxxhd高清| 日韩在线视频网站| 精品人妻无码一区二区色欲产成人 | 欧美在线视频第一页| 成人18视频日本| 国产淫片av片久久久久久| 99精品国产一区二区三区| 风间由美久久久| 网友自拍亚洲| 美女精品久久久| 色综合成人av| 欧美一区二区三区免费在线看| 日本一区二区三区免费视频| 欧美激情综合在线| 香蕉久久久久久av成人| 久久青草久久| 国产激情片在线观看| 妖精一区二区三区精品视频 | 国产一区在线电影| 热久久视久久精品18亚洲精品| 老司机精品影院| 精品视频久久久久久| 91成人在线免费| 五月天丁香久久| 国产一二三区精品| 久久网站最新地址| 久久久久无码精品| 免费精品视频在线| 日韩中字在线观看| 五月精品视频| 日本在线播放不卡| 国产精品乱战久久久| 成人国产在线激情| 中文在线资源| 欧美黑人一级爽快片淫片高清| 精品视频一二区| 国产激情一区二区三区四区| 懂色一区二区三区免费观看| 亚洲一区二区在线播放相泽| 超碰av在线免费观看| 亚洲视频在线免费| 日韩av一区二区三区美女毛片| 精品一区二区三区四区五区| 国产999精品| av影片在线| 欧美成人性色生活仑片| 91免费在线| 亚洲小视频在线| 五月天婷婷视频| 亚洲成人xxx| 精品人妻一区二区三区蜜桃| 欧美日韩国产高清一区二区| 波多野结衣电影在线播放| 精品久久久视频| xxxxxx国产| 亚洲观看高清完整版在线观看| 我要看黄色一级片| 中文字幕一区在线观看视频| 91激情视频在线观看| 久久久久青草大香线综合精品| 亚洲最大视频网| 国产精品性做久久久久久| 视频免费1区二区三区| 日本不卡视频一二三区| 天天干在线影院| 美女久久久精品| 日本xxxx黄色| 久久99精品视频| 国产成年人视频网站| 久久超碰97人人做人人爱| www.精品在线| 久久69国产一区二区蜜臀| 国产精品嫩草影院8vv8| 狠狠色2019综合网| 91热视频在线观看| 国产成人综合网| 9.1在线观看免费| 99精品一区二区| 国产精品拍拍拍| 欧美三级黄网| 在线电影中文日韩| 天天在线视频色| 啊v视频在线一区二区三区| 免费网站看v片在线a| 久久99热精品这里久久精品| 成人影院在线播放| 98视频在线噜噜噜国产| 欧美日韩美女| 国产精品一区二区久久国产| av在线播放一区二区| 91蜜桃网站免费观看| 国产日韩三级| 日本精品一区二区三区高清 久久| 教室别恋欧美无删减版| 一级特黄录像免费播放全99| 影音先锋日韩精品| 国产精品无码人妻一区二区在线 | 精品嫩模一区二区三区| 亚洲黄页一区| 欧美精品成人网| 久久99精品国产.久久久久| 久久无码人妻一区二区三区| 成年人午夜久久久| www亚洲色图| 亚洲码国产岛国毛片在线| 日韩美女一级片| 欧美综合在线视频| 国产哺乳奶水91在线播放| 亚洲国产成人精品久久| 国产成人天天5g影院在线观看| 久久精品一区中文字幕| 6699嫩草久久久精品影院| 日本一区二区在线播放| 国产免费区一区二区三视频免费| 国产中文一区二区| 成人av国产| 2018中文字幕第一页| 日韩精品福利网| 佐佐木明希电影| 欧美激情在线一区二区| 国产一级一片免费播放| 欧洲精品视频在线观看| 日韩中文字幕免费观看| 色yeye香蕉凹凸一区二区av| www555久久| 成人国产精品一区二区| 综合亚洲色图| 老司机午夜免费福利视频| 久久综合亚州| 国产 中文 字幕 日韩 在线| 亚洲欧美欧美一区二区三区| 国产免费一级视频| 精品国产凹凸成av人导航| 调教视频免费在线观看| 国产97在线亚洲| 婷婷精品视频| www污在线观看| 紧缚捆绑精品一区二区| a天堂中文字幕| 精品露脸国产偷人在视频| 国产黄色一级大片| 日韩中文字幕在线| 浪潮色综合久久天堂| 国产专区一区二区| 韩日视频一区| 爽爽爽在线观看| 欧美激情黑白配| 欧美精品自拍偷拍| 第一页在线观看| 青青草一区二区| 欧洲vs亚洲vs国产| a级免费在线观看| 国产精品456露脸| 性生交大片免费全黄| 欧美视频第二页| 国产小视频在线观看| 庆余年2免费日韩剧观看大牛| 精品欧美午夜寂寞影院| 国产精品日韩三级| 国产精品资源网| 粉嫩av性色av蜜臀av网站| 国产拍欧美日韩视频二区| 性欧美精品中出| 99国产精品99久久久久久| 久热精品在线观看| 精品日韩av一区二区| 青春草视频在线| 成人自拍偷拍| 精品91在线| 中文字幕一区二区人妻电影丶| 亚洲综合丝袜美腿| 欧美一级特黄aaaaaa| 欧美激情视频在线观看| 51亚洲精品| www.日本在线播放| 26uuu久久天堂性欧美| 天堂网免费视频| 伊人av综合网| 亚洲日日夜夜| 粉嫩av一区二区三区天美传媒 | 高清日韩av电影| 国产精品高潮呻吟久久av野狼| jizzjizz欧美69巨大| 午夜久久福利视频| 尤物视频一区二区| 天堂中文资源在线观看| 欧美在线精品免播放器视频| 美女久久99 | caoporn国产精品| 欧美在线观看不卡| 在线视频日本亚洲性| 成人短视频软件网站大全app| 大桥未久一区二区三区| www.久久精品| 黄色片视频免费| www.欧美精品| jizz性欧美23| 成人性视频欧美一区二区三区| 国产精品久久久久久久久免费樱桃| 国产乱码精品一区二三区蜜臂 | 亚洲一区在线观看视频| 天堂成人在线观看| 国产精品久久精品| 伊人久久大香线| 国产精品边吃奶边做爽| 欧美日韩第一区日日骚| 色屁屁www国产馆在线观看| 精品在线一区| 国内精品自线一区二区三区视频| 日本少妇做爰全过程毛片| 国产一区二区精品丝袜| 精品久久免费| 成人小视频在线看| 亚洲欧美激情在线| 欧美成人免费| 国产成人拍精品视频午夜网站 | 黑人巨大精品欧美一区二区小视频| 樱桃成人精品视频在线播放| av黄色在线免费观看| 日韩丝袜美女视频| **欧美日韩在线观看| 四虎4hu永久免费入口| 国产色一区二区|