久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

為什么線程同步的時(shí)候pthread

 astrotycoon 2015-01-28
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count = 0;

decrement_count () {
    pthread_mutex_lock (&count_lock);
    while(count==0)
        pthread_cond_wait( &count_nonzero, &count_lock);

    count=count -1;
    pthread_mutex_unlock (&count_lock);
}
 
increment_count(){
    pthread_mutex_lock(&count_lock);
 
    if(count==0)
        pthread_cond_signal(&count_nonzero);
 
    count=count+1;
    pthread_mutex_unlock(&count_lock);
}

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(){
     count=count+1;
 
    if(count==0)
        pthread_cond_signal(&count_nonzero);
}
 
這樣沒(méi)有問(wèn)題,。但是這種方法并不能保證所有情況下都適用,。于是需要用互斥鎖保護(hù)條件鎖相關(guān)的變量。也就是說(shuō)條件鎖是用來(lái)線程通訊的,,但是互斥鎖是為了保護(hù)這種通訊不會(huì)產(chǎn)生邏輯錯(cuò)誤,,可以正常工作。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多