不使用系統API來實現互斥保護功能

2021-04-16 06:41:08 字數 964 閱讀 3125

一般臨界資源的互斥保護,需要使用類似take_mutex / give_mutex 類似的系統api來實現,

一般需要從使用者空間切換到核心空間,有時候可能要關中斷等,為了實現乙個開銷小的,

volatile int a = 0;

volatile int b = 0;

/*  執行緒 a */

void thread_a()

else }}

/*  執行緒 b */

void thread_b()

else }}

現在來分析一下為什麼這兩個執行緒能實現互斥,

a執行緒首先將a加1,然後去加查b變數,如果b為0,說明b執行緒還沒有將b加1,或者是b執行緒已經將b加1,但還沒有寫回到記憶體。總之b執行緒還執行在b++語句之前的某個位置,或者是剛執行完b=0的操作(即執行在b=0與b++之間的某個位置),所以我們斷定b此時沒有進入臨界區,故a執行緒可以執行後面的臨界區訪問操作。

那麼如果但a執行緒檢查b變數時,如果b變數不等於0,那麼此時b執行緒有可能在訪問臨界區,也有可能只是執行完了b++語句,但還沒有進入臨界區,此時a執行緒通過if ( b == 0 )的判斷來避免了與b同時進入臨界區的危險。

再分析,因為a執行緒在嘗試進入臨界區之前會將自己的開關變數a加1,所以一旦a互斥檢查獲得通過的話(if ( b == 0 )),就說明自己可以放心進入臨界區了,因為此時可以肯定對方執行在b = 0;

與 b++;這兩條語句之間,而不是b++與b=0之間(請注意這兩條語句的先後順序),所以當a進入了臨界區,並處在臨界區的這段時間內,b會被 if ( a == 0 )這個條件阻擋在臨界區外,直到a出了臨界區,執行a=0;break;,

此時b才有可能進入到臨界區。

根據對稱性,把a和 b反過來分析也一樣,當然這種方法有很多缺點,比如極端情況下兩個執行緒有可能都進不了

臨界區等,我這裡就不一一枚舉了,僅僅做個試驗嘗試而已。

在**p的環境中,這種方法應該也可以,不會有邏輯錯誤。 

使用 flask restful 來開發API

在雙十一買了阿里云云小蜜的培訓課程,花了幾天學了一下,不過考了兩次都沒有考過,但是能夠熟練使用雲小蜜來搭建業務了,為了整合一些外部資料,例如天氣,交通,電影啥的,需要封裝處理一下第三方api或者呼叫自己的資料庫。最後的需求就是變成restful api了,可以把這個請求位址直接放到雲小蜜裡邊。res...

不使用HOOK實現系統選單的自繪

這篇文章的作者很大程度上簡化了選單的自繪,缺陷是沒有實現系統選單的自繪,第二次彈出系統選單的時候才開始自繪,有時候一直都是預設的系統選單,不穩定。問什麼第一次彈出的時候沒有自繪?那我要是在wm initmenu和wm initmenupopup子前的訊息中就修改系統選單項可不可以?答案是可以的。我們...

不使用除法來做 a b 2

題目 不使用除法來做 a b 2 題目分析 在不使用除法來做兩數的除法時,而且是除以2,所以首先想到的就是資料的右移,右移就是使整數縮小一半,但是這裡要考慮兩數相除得到的不一定都是整數,所以要按情況來補所缺失的0.5.如下 define crt secure no warnings include ...