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

深入探究C/C++中互斥量(鎖)的實現(xiàn)原理

 更新時間:2024年06月02日 09:12:02   作者:螺螄粉只吃炸蛋的走風(fēng)  
? 互斥量是一種同步原語,用于保護(hù)多個線程同時訪問共享數(shù)據(jù),互斥量提供獨占的、非遞歸的所有權(quán)語義,本文將和大家一起深入探究C/C++中互斥量(鎖)的實現(xiàn)原理,感興趣的小伙伴跟著小編一起來看看吧

互斥量的概念

互斥量(mutex)是一種同步原語,用于保護(hù)多個線程同時訪問共享數(shù)據(jù)?;コ饬刻峁┆氄嫉摹⒎沁f歸的所有權(quán)語義:一個線程從成功調(diào)用locktry_lock開始,到調(diào)用unlock結(jié)束,都擁有互斥量。

何為原子性操作

程序的原子性指:整個程序中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環(huán)節(jié)。

原子性在一個操作是不可中斷的,要么全部執(zhí)行成功要么全部執(zhí)行失敗,有著 “同生共死” 的感覺。在多個線程一起執(zhí)行的時候,一個操作一旦開始,就不會被其他線程所干擾

如果要保證原子性,必須符合以下兩條規(guī)則:

運算結(jié)果并不依賴于變量的當(dāng)前值,或者能夠確保只有一個線程修改變量的值。

變量不需要與其他的狀態(tài)變量共同參與不變約束。

原理探究

首先給出一段加鎖場景的部分代碼:

void route(ThreadData *td)
{
    // 加鎖
    while (true)
    {
        pthread_mutex_lock(&td->_mutex);    // 加鎖
        if (td->_tickets > 0)
        {
            // 模擬一次搶票的邏輯
            usleep(1000);
            printf("%s running, get tickets: %d\n", td->_name.c_str(), td->_tickets);
            td->_tickets--;
            pthread_mutex_unlock(&td->_mutex); // 解鎖
            td->_total++;
        }
        else
        {
            pthread_mutex_unlock(&td->_mutex); // 解鎖
            break;
        }
    }
}

上面這段代碼模擬了搶票邏輯,將多線程并行搶票通過鎖的加入變?yōu)榇袌?zhí)行,有效避免了惡意數(shù)據(jù)競爭(data race)。

我們不妨假定有兩個線程同時執(zhí)行到 加鎖指令 位置:

在這里插入圖片描述

(上圖左側(cè)部分為加鎖和解鎖對應(yīng)的匯編語言代碼,其中每一行簡單匯編指令的執(zhí)行都是原子的)

不妨設(shè)定 thread-1 先進(jìn)入 lock 邏輯 (thread-2先進(jìn)入同理,不影響推斷):

(這里的先進(jìn)入 lock 邏輯,實際上指的是先執(zhí)行左側(cè)匯編語言中 xchgb &al, mutex 語句)

這就意味著 thread-1先執(zhí)行交換語句,將系統(tǒng)指定初始的 mutex 值 (存儲在內(nèi)存中) 與寄存器初始值 0 進(jìn)行交換,從而寄存器中值變?yōu)?。

在這里插入圖片描述

由于匯編語言簡單語句的單行執(zhí)行是原子的,此時thread-1 已經(jīng)執(zhí)行完 xchgb &al, mutex 語句,所以不排除 thread-2 緊接著也執(zhí)行 xchgb &al, mutex 語句的可能。(線程被切換的時機是隨時的)

這時我們需要注意:

  • CPU寄存器的硬件只有一套,但是寄存器內(nèi)的數(shù)據(jù),屬于線程的硬件上下文 !
  • 數(shù)據(jù)在內(nèi)存中存儲時,所有線程都能訪問,屬于共享資源,但是當(dāng)數(shù)據(jù)從內(nèi)存移動到寄存器時,就屬于一個線程私有了 !

當(dāng)執(zhí)行線程從 thread-1 變?yōu)?thread-2 時,隸屬于 thread-1 的寄存器硬件上下文被取走,thread-1::%al 寄存器值為1,CPU內(nèi)%al寄存器值恢復(fù)為空。

所以,當(dāng) thread-2 執(zhí)行 xchgb &al, mutex 語句時,訪問到寄存器內(nèi)存儲的內(nèi)容為自身線程所屬寄存器的初始值(thread-2 先前執(zhí)行了 moveb $0, %al ,所以初始值為0),由于內(nèi)存中 mutex 初始值1已經(jīng)被 thread-1 交換取走,此時內(nèi)存中 mutex 的值為0,進(jìn)行交換后 %al寄存器 中的值依然為0。

經(jīng)過匯編的下層判斷語句 if(%al寄存器內(nèi)容 > 0) 不符合條件,故 thread-2 沒有成功獲得鎖,需要執(zhí)行 goto lock 語句重新申請鎖的資源。

在這里插入圖片描述

綜上我們可以看到,所有線程在爭鎖的時候,只有一個 1 ?。。?/p>

至此,我們發(fā)現(xiàn) thread-2 想要繼續(xù)執(zhí)行,就必須等待 thread-1 釋放鎖,所以程序的執(zhí)行流程就由 thread-1 執(zhí)行到釋放鎖結(jié)束后,將內(nèi)存中 mutex 變量置為1,thread-2 才終止等待,獲得 thread-1 釋放的鎖后,執(zhí)行自身的代碼邏輯。

引入鎖的用途就是為了解決并發(fā)訪問出現(xiàn)的問題,其問題的本質(zhì)是多個執(zhí)行流同時執(zhí)行訪問全局?jǐn)?shù)據(jù)的代碼造成的。使用鎖保護(hù)全局共享資源的本質(zhì)是通過保護(hù)臨界區(qū)完成的

以上就是深入探究C/C++中互斥量(鎖)的實現(xiàn)原理的詳細(xì)內(nèi)容,更多關(guān)于C/C++互斥量(鎖)實現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++編寫簡單的計算器程序

    c++編寫簡單的計算器程序

    用c++語言實現(xiàn)一個簡單的計算器,新手作品,僅僅包括基本的加減乘除運算。希望能夠給菜鳥們一些啟發(fā)
    2016-05-05
  • 在c和c++中實現(xiàn)函數(shù)回調(diào)

    在c和c++中實現(xiàn)函數(shù)回調(diào)

    如何在c和c++中實現(xiàn)函數(shù)回調(diào)呢?現(xiàn)在小編就和大家分享一下在c/c++中實現(xiàn)函數(shù)回調(diào)的示例代碼,需要的朋友可以參考下
    2013-07-07
  • C語言庫函數(shù)qsort及bsearch快速排序算法使用解析

    C語言庫函數(shù)qsort及bsearch快速排序算法使用解析

    這篇文章主要為大家介紹了C語言庫函數(shù)qsort及bsearch快速排序算法的使用示例解析
    2022-02-02
  • libxml教程(圖文詳解)

    libxml教程(圖文詳解)

    本篇文章是對libxm進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)

    一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)

    這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造和析構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言利用鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)

    C語言利用鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言如何利用鏈表實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作

    C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作

    這篇文章主要介紹了C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • oaptt搭建http服務(wù)的過程詳解

    oaptt搭建http服務(wù)的過程詳解

    這篇文章主要介紹了oaptt搭建http服務(wù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 一文帶你學(xué)習(xí)C++中的派生機制

    一文帶你學(xué)習(xí)C++中的派生機制

    C++是一門面向?qū)ο蟮木幊陶Z言,其中的派生機制是其重要的面向?qū)ο筇匦灾弧1疚奈覀兙蛠碓敿?xì)地學(xué)習(xí)一下C++中的派生機制的相關(guān)知識吧
    2023-04-04
  • C語言?指針數(shù)組進(jìn)階詳解

    C語言?指針數(shù)組進(jìn)階詳解

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02

最新評論