無(wú)鎖編程之概述

概述

為什么我們需要無(wú)鎖編程

多核編程中,我們常用鎖來(lái)避免多個(gè)線(xiàn)程同時(shí)修改同一個(gè)數(shù)據(jù)時(shí)產(chǎn)生的條件競(jìng)爭(zhēng)。當(dāng)鎖本身成為瓶頸時(shí),我們又總想試著繞開(kāi)鎖,而不可避免地接觸了原子指令。但在實(shí)踐中,用原子指令寫(xiě)出正確的代碼是一件非常困難的事,捉摸不透的條件競(jìng)爭(zhēng)、ABA 問(wèn)題、內(nèi)存模型很燒腦。

無(wú)鎖編程的相關(guān)概念

lock-free:不管OS如何調(diào)度線(xiàn)程,至少有一個(gè)線(xiàn)程在做有用的事情。

wait-free:不管OS如何調(diào)度線(xiàn)程,每個(gè)線(xiàn)程都始終在做有用的事情。

:OS可能把一個(gè)剛獲得鎖的線(xiàn)程切換出去,這時(shí)候所有依賴(lài)這個(gè)鎖的線(xiàn)程都在等待,而沒(méi)有做有用的事。所以,使用了鎖的代碼,不可能是lock-free的,更不可能是wait-free的。

如果代碼中沒(méi)有顯式調(diào)用鎖,那么它一定是lock-free的嗎?答案是,不一定。假如有兩個(gè)線(xiàn)程同時(shí)調(diào)用下面這段代碼,是有可能無(wú)限循環(huán)的。

while (X == 0) // 總是同時(shí)進(jìn)入
{
    X = 1 - X; // 修改總是一定的先后順序
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容