從第6章中的基于鎖的數(shù)據(jù)結(jié)構(gòu)起,本章簡(jiǎn)要的描述了一些無(wú)鎖數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)(通過(guò)實(shí)現(xiàn)棧和隊(duì)列)。在這個(gè)過(guò)程中,需要小心使用原子操作的內(nèi)存序,為了保證無(wú)數(shù)據(jù)競(jìng)爭(zhēng),以及讓每個(gè)線程看到一個(gè)預(yù)制相關(guān)的數(shù)據(jù)結(jié)構(gòu)。也能了解到,在無(wú)鎖結(jié)構(gòu)中對(duì)內(nèi)存的管理是越來(lái)越難。還有,如何通過(guò)幫助線程的方式,來(lái)避免忙等待循環(huán)。
設(shè)計(jì)無(wú)鎖數(shù)據(jù)結(jié)構(gòu)是一項(xiàng)很困難的任務(wù),并且很容易犯錯(cuò);不過(guò),這樣的數(shù)據(jù)結(jié)構(gòu)在某些重要情況下可對(duì)其性能進(jìn)行擴(kuò)展。但愿,通過(guò)本章的的一些例子,以及一些指導(dǎo)意見(jiàn),可以幫助你設(shè)計(jì)出自己的無(wú)鎖數(shù)據(jù)結(jié)構(gòu),或是實(shí)現(xiàn)一份研究報(bào)告中的數(shù)據(jù)結(jié)構(gòu),或用以發(fā)現(xiàn)離職同事代碼中的bug。
不管在線程間共享怎么樣的數(shù)據(jù),你需要考慮數(shù)據(jù)結(jié)構(gòu)如何使用,并且怎么樣在線程間同步數(shù)據(jù)。通過(guò)設(shè)計(jì)并發(fā)訪問(wèn)的數(shù)據(jù)結(jié)構(gòu),就能對(duì)數(shù)據(jù)結(jié)構(gòu)的功能進(jìn)行封裝,其他部分的代碼就著重于對(duì)數(shù)據(jù)的執(zhí)行,而非數(shù)據(jù)的同步。你將會(huì)在第8章中看到類似的行為:將并發(fā)數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為一般的并發(fā)代碼。并行算法是使用多線程的方式提高性能,因?yàn)樗惴ㄐ枰ぷ骶€程共享它們的數(shù)據(jù),所以對(duì)并發(fā)數(shù)據(jù)結(jié)構(gòu)的選擇就很關(guān)鍵了。