常見鎖原理和使用 旋轉鎖和SRWLock

2021-08-06 01:15:33 字數 1680 閱讀 3097

參考部落格:  執行緒同步

1、旋轉鎖:

在實現旋轉鎖的時候

interlockedexchange

及其有用。

while(interlockedexchange(&flag,true) ==true) sleep(0);

把flag的值設為

true,

並檢查原來的值是否為

true

,若是,則說明有其他執行緒正在使用該資源,於是

while

迴圈會繼續執行,直到其他函式將

flag

改為false

。缺點:旋轉鎖會消耗

cpu時間

,cpu

不斷比較兩個值,直到另乙個執行緒改變

flag

。flag

不用設為volatile型別。

2、關鍵段+旋轉鎖實現過程:許多開發人員會迴圈指定的次數(比如4000)如果屆時仍無法訪問資源

,那麼執行緒會切換到核心模式,並一直等到資源可供使用為止(此時它不消耗

cpu時間)這就是關鍵段的實現方式;

如果乙個關鍵段正在被另外乙個執行緒占用時,函式會立即把呼叫執行緒切換到等待狀態,這意味著執行緒必須從使用者模式切換到核心模式(大約1000個cpu週期),如果占用者馬上用完,切換浪費了大量時間。

函式功能:初始化關鍵段並設定旋轉次數

函式原型:

bool

initializecriticalsectionandspincount(

lpcritical_section

lpcriticalsection

,  //結構體位址

dword

dwspincount

);                                 //旋轉次數

函式說明:旋轉次數一般設定為4000。

函式功能:修改關鍵段的旋轉次數

函式原型:

dword

setcriticalsectionspincount(

lpcritical_section

lpcriticalsection,

dword

dwspincount

);   //更新的旋轉次數。

3、slim讀寫鎖

vs關鍵段:

相同點:對乙個資源進行保護,不讓其他執行緒訪問它。

不同點:①輕型讀寫鎖(srwlock

)允許區分哪些想要讀取資源的值執行緒(讀取者執行緒)和想要更新資源的值的執行緒(寫入者執行緒)。讓所有的讀取者執行緒在同一時刻訪問共享資源,在寫入時獨佔。

②如果鎖被占用,那麼呼叫acquire...

會阻塞呼叫執行緒。無

tryenter...

之類的函式。

③不能遞迴地獲得srwlock

,乙個執行緒不能為了多次寫入資源而多次鎖定資源。

void initializesrwlock(pswlock srwlock);

寫入者:acquiresrwlockexclusive(pswlock srwlock);

releasesrwlockexclusive(pswlock srwlock);

讀取者:acquiresrwlockshared(pswlock srwlock);

releasesrwlockshared(pswlock srwlock);

不存在刪除或者銷毀

樂觀鎖和悲觀鎖的使用

1.樂觀鎖和悲觀鎖各自的機制 a.樂觀鎖是一種思想,具體實現是,表中有乙個版本字段 或者是時間戳 第一次讀的時候,獲取到這個字段。處理完業務邏輯開始更新的時候,需要再次檢視該字段的值是否和第一次的一樣。如果一樣更新,反之拒絕。之所以叫樂觀,因為這個模式沒有從資料庫加鎖。b.悲觀鎖是讀取的時候為後面的...

樂觀鎖和悲觀鎖的原理與應用

名稱 描述應用場景 樂觀鎖每次拿資料都認為不會修改,不上鎖,但是更新的時候會判斷在此期間別人有沒有去更新這個資料 版本號或時間戳控制,適用於高併發,讀多寫少的場景 悲觀鎖每次拿資料都認為會修改,所以每次拿資料的時候都會上鎖,只有等待鎖標記釋放,之後才能拿到資料 ddb的行鎖,表鎖等,適用於資料一致性...

全域性鎖 表鎖和行鎖

全域性鎖就是對整個資料庫例項加鎖,mysql提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock。讓你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞 a 資料更新語句 b 資料定義語句 c 更新類事務的提交語句 mysql裡面...