本章主要內(nèi)容
上一章中,我們了解了在設(shè)計(jì)并發(fā)數(shù)據(jù)結(jié)構(gòu)時(shí)會(huì)遇到的問題,根據(jù)指導(dǎo)意見指引,確定設(shè)計(jì)的安全性。對(duì)一些通用數(shù)據(jù)結(jié)構(gòu)進(jìn)行檢查,并查看使用互斥鎖對(duì)共享數(shù)據(jù)進(jìn)行保護(hù)的實(shí)現(xiàn)例子。第一組例子就是使用單個(gè)互斥量來保護(hù)整個(gè)數(shù)據(jù)結(jié)構(gòu),但之后的例子就會(huì)使用多個(gè)鎖來保護(hù)數(shù)據(jù)結(jié)構(gòu)的不同部分,并且允許對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行更高級(jí)別的并發(fā)訪問。
互斥量是一個(gè)強(qiáng)大的工具,其可以保證在多線程情況下可以安全的訪問數(shù)據(jù)結(jié)構(gòu),并且不會(huì)有條件競(jìng)爭(zhēng)或破壞不變量的情況存在。對(duì)于使用互斥量的代碼,其原因也是很簡(jiǎn)單的:就是讓互斥量來保護(hù)數(shù)據(jù)。不過,這并不會(huì)如你所想的那樣;你可以回看一下第3章,回顧一下死鎖形成的原因,再回顧一下基于鎖的隊(duì)列和查詢表的例子,看一下細(xì)粒度鎖是如何影響并發(fā)的。如果你能寫出一個(gè)無鎖并發(fā)安全的數(shù)據(jù)結(jié)構(gòu),那么就能避免這些問題。
在本章中,我們還會(huì)使用原子操作(第5章介紹)的“內(nèi)存序”特性,并使用這個(gè)特性來構(gòu)建無鎖數(shù)據(jù)結(jié)構(gòu)。設(shè)計(jì)這樣的數(shù)據(jù)結(jié)構(gòu)時(shí),要格外的小心,因?yàn)檫@樣的數(shù)據(jù)機(jī)構(gòu)不是那么容易正確實(shí)現(xiàn)的,并且讓其失敗的條件很難復(fù)現(xiàn)。我們將從無鎖數(shù)據(jù)的定義開始;而后,將繼續(xù)通過幾個(gè)例子來了解使用無鎖數(shù)據(jù)結(jié)構(gòu)的意義,最后給出一些通用的指導(dǎo)意見。