本章討論了當(dāng)兩個線程間的共享數(shù)據(jù)發(fā)生惡性條件競爭會帶來多么嚴(yán)重的災(zāi)難,還討論了如何使用std::mutex
,和如何避免這些問題。如你所見,互斥量并不是靈丹妙藥,其還有自己的問題(比如:死鎖),雖然C++標(biāo)準(zhǔn)庫提供了一類工具來避免這些(例如:std::lock()
)。你還見識了一些用于避免死鎖的先進(jìn)技術(shù),之后了解了鎖所有權(quán)的轉(zhuǎn)移,以及一些圍繞如何選取適當(dāng)粒度鎖產(chǎn)生的問題。最后,討論了在具體情況下,數(shù)據(jù)保護(hù)的替代方案,例如:std::call_once()
和boost::shared_mutex
。
還有一個方面沒有涉及到,那就是等待其他線程作為輸入的情況。我們的線程安全棧,僅是在棧為空時,拋出一個異常,所以當(dāng)一個線程要等待其他線程向棧壓入一個值時(這是一個線程安全棧的主要用途之一),它不得不多次嘗試去彈出一個值,當(dāng)捕獲拋出的異常時,再次進(jìn)行嘗試。這種消耗資源的檢查,沒有任何意義。并且,不斷的檢查會影響系統(tǒng)中其他線程的運行,這反而會妨礙程序的進(jìn)展。我們需要一些方法讓一個線程等待其他線程完成任務(wù),但在等待過程中不占用CPU。第4章中,會去建立一些工具,用于保護(hù)共享數(shù)據(jù),還會介紹一些線程同步操作的機(jī)制;第6章中,如何構(gòu)建更大型的可復(fù)用的數(shù)據(jù)類型。