參考部落格: 執行緒同步
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裡面...