概述
為什么我們需要無(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; // 修改總是一定的先后順序
}