pthread_mutex_t count_lock;
pthread_cond_t count_nonzero; unsigned count = 0; decrement_count () { } increment_count(){
} decrement_count和increment_count在兩個(gè)線程A和B中被調(diào)用。
正確的情況下,,如果decrement_count首先運(yùn)行,,那么A會(huì)被阻塞到pthread_cond_wait。隨后increment_count運(yùn)行,,它調(diào)用pthread_cond_signal喚醒等待條件鎖count_nonzero的A線程,,但是A線程并不會(huì)馬上執(zhí)行,因?yàn)樗貌坏交コ怄icount_lock,。當(dāng)B線程執(zhí)行pthread_mutex_unlock之后A線程才得以繼續(xù)執(zhí)行,。
如果pthread_cond_signal前后沒(méi)有使用互斥鎖count_lock保護(hù),可能的情況是這樣,。A阻塞到pthread_cond_wait,,然后B執(zhí)行到pthread_cond_signal時(shí)候,發(fā)生了線程切換,,于是A被喚醒,,并且發(fā)現(xiàn)count依然是0,,所以繼續(xù)阻塞到條件鎖count_nonzero上。然后B繼續(xù)執(zhí)行,,這時(shí)候盡管count=1,,A永遠(yuǎn)不會(huì)被喚醒了。這樣就發(fā)生了邏輯錯(cuò)誤,。
當(dāng)然在這個(gè)上下文中,如果把count=count+1放在函數(shù)放在pthread_cond_signal之前變成
increment_count(){
}
這樣沒(méi)有問(wèn)題,。但是這種方法并不能保證所有情況下都適用,。于是需要用互斥鎖保護(hù)條件鎖相關(guān)的變量。也就是說(shuō)條件鎖是用來(lái)線程通訊的,,但是互斥鎖是為了保護(hù)這種通訊不會(huì)產(chǎn)生邏輯錯(cuò)誤,,可以正常工作。
|
|
來(lái)自: astrotycoon > 《thread》