最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++鎖機(jī)制與信號機(jī)制對比分析

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

前言

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

一、鎖機(jī)制

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

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

基本用法

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

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

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

std::unique_lock:更靈活,支持延遲加鎖和手動控制。

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

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

  • 核心操作
  • 等待(Wait):線程在條件不滿足時掛起。 通知(Notify):條件滿足時喚醒等待的線程。
    notify_one():喚醒一個等待線程。
    notify_all():喚醒所有等待線程。
    基本用法等待條件(需配合互斥鎖和謂詞檢查):
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); // 等價于 while (!predicate) cv.wait(lock);

三、信號量(Semaphore)

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

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

四、鎖與信號機(jī)制的對比

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

相關(guān)文章

  • C語言 數(shù)組指針詳解及示例代碼

    C語言 數(shù)組指針詳解及示例代碼

    本文主要介紹C語言 數(shù)組指針,這里整理了相關(guān)資料并附示例待會及實現(xiàn)結(jié)果,幫助大家學(xué)習(xí)C語言中指針的知識,有需要學(xué)習(xí)此部分內(nèi)容的朋友可以參考下
    2016-08-08
  • C++避免棧內(nèi)存溢出的幾種實現(xiàn)方法

    C++避免棧內(nèi)存溢出的幾種實現(xiàn)方法

    在C++編程中,一個線程的棧內(nèi)存通常是有限的,本文就來詳細(xì)介紹幾種避免棧溢出的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • 使用C語言順序表數(shù)據(jù)結(jié)構(gòu)實現(xiàn)棧的代碼示例

    使用C語言順序表數(shù)據(jù)結(jié)構(gòu)實現(xiàn)棧的代碼示例

    這篇文章主要給大家介紹了如何使用C語言順序表數(shù)據(jù)結(jié)構(gòu)實現(xiàn)棧,文章通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下
    2023-09-09
  • 介紹C語言中tolower函數(shù)的實例

    介紹C語言中tolower函數(shù)的實例

    這篇文章主要介紹了介紹C語言中tolower函數(shù)的實例,本文列出了該函數(shù)的頭文件,功能說明等,以及如何使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++超詳細(xì)講解函數(shù)重載

    C++超詳細(xì)講解函數(shù)重載

    C++ 允許多個函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading),借助重載,一個函數(shù)名可以有多種用途
    2022-05-05
  • C語言實現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計

    C語言實現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 用C語言實現(xiàn)五子棋游戲

    用C語言實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了用C語言實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ explicit關(guān)鍵字的使用詳解

    C++ explicit關(guān)鍵字的使用詳解

    這篇文章主要介紹了C++ explicit關(guān)鍵字的使用詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 利用C++實現(xiàn)最長公共子序列與最長公共子串

    利用C++實現(xiàn)最長公共子序列與最長公共子串

    這篇文章主要給大家介紹了如何利用C++實現(xiàn)最長公共子序列與最長公共子串,文章一開始就給大家簡單的介紹了什么是子序列,子串應(yīng)該比較好理解就不用多介紹了,人后通過算法及示例代碼詳細(xì)介紹了C++實現(xiàn)的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • 談?wù)凜++學(xué)習(xí)之Pair的使用方法

    談?wù)凜++學(xué)習(xí)之Pair的使用方法

    pair是一種模板類型,其中包含兩個數(shù)據(jù)值,兩個數(shù)據(jù)的類型可以不同,本篇詳細(xì)的介紹了Pair的使用方法和實例,有興趣的同學(xué)可以了解一下。
    2016-12-12

最新評論

凤凰县| 台东县| 共和县| 岐山县| 南安市| 梨树县| 岳普湖县| 龙南县| 宣武区| 玉林市| 明溪县| 黄陵县| 遂溪县| 新民市| 宣城市| 巴林右旗| 望谟县| 长宁区| 宿松县| 蚌埠市| 美姑县| 青海省| 凤翔县| 武威市| 松滋市| 察隅县| 轮台县| 昭平县| 常熟市| 沧源| 贵阳市| 资源县| 昭觉县| 平原县| 南安市| 抚顺县| 兴城市| 延安市| 普兰店市| 新和县| 梓潼县|