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

C++鎖機(jī)制與信號(hào)機(jī)制對(duì)比分析

 更新時(shí)間:2025年06月21日 11:26:40   作者:張新顏  
文章介紹C++多線程編程中線程同步與通信的鎖機(jī)制(互斥鎖、讀寫(xiě)鎖及RAII封裝)和信號(hào)機(jī)制(條件變量、信號(hào)量),并對(duì)比其在資源控制、并發(fā)限制和線程協(xié)調(diào)中的應(yīng)用場(chǎng)景與優(yōu)缺點(diǎn),對(duì)C++鎖機(jī)制與信號(hào)機(jī)制相關(guān)知識(shí)感興趣的朋友一起看看吧

前言

在C++中,多線程編程的線程同步和通信主要依賴于鎖機(jī)制和信號(hào)機(jī)制。

一、鎖機(jī)制

鎖用于控制對(duì)共享資源的訪問(wèn),防止多個(gè)線程同時(shí)修改數(shù)據(jù)導(dǎo)致競(jìng)態(tài)條件。

  • 互斥鎖(Mutex)
    作用:確保同一時(shí)間只有一個(gè)線程能訪問(wèn)共享資源。
    類型:
    ○ std::mutex:基本互斥鎖。
    ○ std::recursive_mutex:允許同一線程多次加鎖(解決遞歸調(diào)用中的鎖問(wèn)題)。
    ○ std::shared_mutex(C++17):讀寫(xiě)鎖,允許多個(gè)讀線程或單個(gè)寫(xiě)線程訪問(wèn)。

基本用法

#include <mutex>
std::mutex mtx;
void thread_func() {
    mtx.lock();
    // 訪問(wèn)共享資源
    mtx.unlock();
}

RAII包裝器(推薦使用,避免手動(dòng)解鎖):
std::lock_guard:自動(dòng)在作用域內(nèi)加鎖和解鎖。

{
    std::lock_guard<std::mutex> lock(mtx);
    // 自動(dòng)加鎖,離開(kāi)作用域自動(dòng)解鎖
}

std::unique_lock:更靈活,支持延遲加鎖和手動(dòng)控制。

std::unique_lock<std::mutex> lock(mtx, std::defer_lock);
lock.lock(); // 手動(dòng)加鎖
// ...
lock.unlock(); // 可提前解鎖
  • 讀寫(xiě)鎖(Shared Mutex)
    適用場(chǎng)景:讀多寫(xiě)少的情況,提高并發(fā)性能。
    用法:
#include <shared_mutex>
std::shared_mutex rw_mtx;
// 讀操作(共享鎖)
{
    std::shared_lock<std::shared_mutex> lock(rw_mtx);
    // 多個(gè)讀線程可同時(shí)訪問(wèn)
}
// 寫(xiě)操作(獨(dú)占鎖)
{
    std::unique_lock<std::shared_mutex> lock(rw_mtx);
    // 僅一個(gè)寫(xiě)線程可訪問(wèn)
}
  • 死鎖預(yù)防
    原則:
    a. 按固定順序加鎖。
    b. 使用std::lock同時(shí)加多個(gè)鎖(避免死鎖)。
std::lock(mtx1, mtx2); // 原子性鎖定多個(gè)互斥量
std::lock_guard<std::mutex> lock1(mtx1, std::adopt_lock);
std::lock_guard<std::mutex> lock2(mtx2, std::adopt_lock);

二、信號(hào)機(jī)制(條件變量)

  • 核心操作
  • 等待(Wait):線程在條件不滿足時(shí)掛起。 通知(Notify):條件滿足時(shí)喚醒等待的線程。
    notify_one():?jiǎn)拘岩粋€(gè)等待線程。
    notify_all():?jiǎn)拘阉械却€程。
    基本用法等待條件(需配合互斥鎖和謂詞檢查):
std::mutex mtx;
std::condition_variable cv;
bool data_ready = false;
// 等待線程
{
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return data_ready; }); // 防止虛假喚醒
    // 條件滿足后執(zhí)行操作
}
// 通知線程
{
    std::lock_guard<std::mutex> lock(mtx);
    data_ready = true;
    cv.notify_one(); // 或 notify_all()
}
  • 避免虛假喚醒
    使用帶有謂詞檢查的wait:
cv.wait(lock, predicate); // 等價(jià)于 while (!predicate) cv.wait(lock);

三、信號(hào)量(Semaphore)

C++20 引入了std::counting_semaphore,用于控制同時(shí)訪問(wèn)資源的線程數(shù)量。

  • 基本用法
#include <semaphore>
std::counting_semaphore<10> sem(3); // 最大計(jì)數(shù)10,初始3
sem.acquire(); // 計(jì)數(shù)減1(如果計(jì)數(shù)為0則阻塞)
// 訪問(wèn)資源
sem.release(); // 計(jì)數(shù)加1
  • 適用場(chǎng)景
    ● 限制并發(fā)線程數(shù)(如連接池)。
    ● 生產(chǎn)者-消費(fèi)者模型中的緩沖區(qū)控制。

四、鎖與信號(hào)機(jī)制的對(duì)比

到此這篇關(guān)于C++鎖機(jī)制與信號(hào)機(jī)制的文章就介紹到這了,更多相關(guān)C++鎖機(jī)制與信號(hào)機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++讀入

    C++讀入"N,X,Y,Z"格式文本文件到Eigen3 Matrix

    這篇文章主要介紹了C++讀入"N,X,Y,Z"格式文本文件到Eigen3 Matrix,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • C語(yǔ)言實(shí)現(xiàn)漢諾塔游戲

    C語(yǔ)言實(shí)現(xiàn)漢諾塔游戲

    個(gè)人覺(jué)得漢諾塔這個(gè)遞歸算法比電子老鼠的難了一些,不過(guò)一旦理解了也還是可以的,其實(shí)網(wǎng)上也有很多代碼,可以直接參考。記得大一開(kāi)始時(shí)就做過(guò)漢諾塔的習(xí)題,但是那時(shí)代碼寫(xiě)得很長(zhǎng)很長(zhǎng),也是不理解遞歸的結(jié)果。今天重新來(lái)實(shí)現(xiàn)一下
    2015-03-03
  • C語(yǔ)言版五子棋游戲的實(shí)現(xiàn)代碼

    C語(yǔ)言版五子棋游戲的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版五子棋游戲的實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++實(shí)現(xiàn)LeetCode(203.移除鏈表元素)

    C++實(shí)現(xiàn)LeetCode(203.移除鏈表元素)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(203.移除鏈表元素),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++11新特性之自定義字面量

    C++11新特性之自定義字面量

    這篇文章主要介紹了C++11新特性之自定義字面量的相關(guān)資料,幫助大家更好的學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C++STL之string類的使用

    C++STL之string類的使用

    這篇文章主要為大家詳細(xì)介紹了C++STL中的string類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解C++11 原始字符串字面量(Json字符串表達(dá)更方便)

    詳解C++11 原始字符串字面量(Json字符串表達(dá)更方便)

    原始字符串字面量(Raw String Literal)是C++11引入的一種字符串表示方式,用于簡(jiǎn)化字符串的定義,特別是當(dāng)字符串中包含大量特殊字符(如換行符、雙引號(hào)等)時(shí),這篇文章給大家介紹C++11原始字符串字面量(Json字符串表達(dá)更方便)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-03-03
  • C++圖文并茂分析講解內(nèi)存管理

    C++圖文并茂分析講解內(nèi)存管理

    本章主要介紹C語(yǔ)言與C++的內(nèi)存管理,以C++的內(nèi)存分布作為引入,介紹C++不同于C語(yǔ)言的內(nèi)存管理方式(new delete對(duì)比 malloc free),感興趣的朋友來(lái)看看吧
    2022-09-09
  • 淺談C++中virtual的三種用法

    淺談C++中virtual的三種用法

    這篇文章主要介紹了淺談C++中virtual的三種用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C語(yǔ)言算法練習(xí)之折半查找的實(shí)現(xiàn)

    C語(yǔ)言算法練習(xí)之折半查找的實(shí)現(xiàn)

    二分查找法(也叫折半查找)其本質(zhì)是分治算法的一種。這篇文章主要介紹了如何利用C語(yǔ)言實(shí)現(xiàn)折半查找,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-05-05

最新評(píng)論