線程同步中為了保護數據,使程序可以按照預想的方式運行,往往需要加鎖。包括帶判斷的一讀一寫也一樣
線程A:
if(test > 100)
{
testnum=test+10 ;
}
線程B:
test =test-20;
線程B:
test =test-20;
這個執(zhí)行完線程A的if(test > 100)語句后再切換到線程B,執(zhí)行test =test-20;然后再執(zhí)行線程A的testnum=test+10 ;就與預期結果不符。可以通過加鎖解決。
線程A:
加鎖:
if(test > 100)
{
testnum=test+10 ;
}
解鎖:
線程B:
加鎖:
test =test-20;
解鎖:
加鎖:
if(test > 100)
{
testnum=test+10 ;
}
解鎖:
線程B:
加鎖:
test =test-20;
解鎖:
但是有的時候相關的賦值處于中斷或者中斷回調函數中,需要的鎖或者臨界區(qū)需要開關中斷,頻繁開關中斷比較影響性能也不太好。可以通過線程或者中斷的優(yōu)先級來處理(中斷的優(yōu)先級肯定是比線程高的)。分兩種情況:
讀的優(yōu)先級比寫的高:
寫了數據之后再立刻讀,讀完了再寫。寫完數據后通知讀的線程運行,讀的優(yōu)先級較高(不會被寫打斷),這樣通過優(yōu)先級區(qū)分讀寫。
寫的優(yōu)先級比讀高:
寫的數據往往來源于中斷之類的地方,優(yōu)先級比較高也不該終止,這樣將要讀寫的數據存入循環(huán)隊列,這樣通過讀寫隊列中的不同位置來達到保證數據一致性的問題。
閱讀全文