深入理解無鎖編程
我學習無鎖編程是Bruce Dawson 出色而全面的白皮書Lockless Programming Considerations(無鎖編程的思考)。和許多技術(shù)一樣,需要將理論付諸實踐,在平臺上開發(fā)和調(diào)試無鎖代碼。在這篇文章中,我想重新介紹無鎖編程,首先是定義它,然后將大部分信息提煉為幾個關(guān)鍵概念。我將使用流程圖展示這些概念如何相互關(guān)聯(lián),然后我們將深入研究細節(jié)。至少,任何從事無鎖編程的程序員都應(yīng)該已經(jīng)了解如何使用互斥鎖和其他高級同步對象(如信號量和事件)編寫正確的多線程代碼。它是什么?人們通常將無鎖編程描述為沒有互斥鎖的編程,互斥鎖也稱為鎖。這是真的,但這只是故事的一部分。基于學術(shù)文獻的普遍接受的定義更廣泛一些。從本質(zhì)上講,無鎖是一種用于描述某些代碼的屬性,而無需過多說明該代碼的實際編寫方式。基本上,如果您的程序的某些部分滿足以下條件,那么該部分可以理所當然地被認為是無鎖的。相反,如果代碼的給定部分不滿足這些條件,則該部分不是無鎖的。
從這個意義上說,無鎖中的鎖并不直接指互斥鎖,而是指以某種方式“鎖定”整個應(yīng)用程序的可能性,無論是死鎖、活鎖——甚至是由于由你最大的敵人。最后一點聽起來很有趣,但這是關(guān)鍵。共享互斥鎖被簡單地排除在外,因為一旦一個線程獲得互斥鎖,您最大的敵人就再也不會調(diào)度該線程了。當然,真正的操作系統(tǒng)不是這樣工作的——我們只是定義術(shù)語。
這是一個不包含互斥鎖但仍然不是無鎖的操作的簡單示例。最初,X = 0。作為讀者的練習,考慮如何以一種方式調(diào)度兩個線程,使得兩個線程都不退出循環(huán)。while(X == 0 ) {
X = 1 - X;
}
沒有人期望大型應(yīng)用程序是完全無鎖的。通常,我們從整個代碼庫中識別出一組特定的無鎖操作。例如,在一個無鎖隊列中,有可能是無鎖的操作,比如極少數(shù)的
push,pop也許isEmpty等。Herlihy





