1、共享資源是一個自動鎖住的房間,互斥體是鑰匙,進入房間必須取鑰匙,離開房間應該還鑰匙。這就對應着互斥體的lock(取鑰匙)和unlock(還鑰匙)。
2、考慮下面的場景:還鑰匙的時候出現異常,會發生什么?
導致死鎖,因為鑰匙歸還失敗,所有人都沒法再取到鑰匙。
3、如何解決這個問題?
想一下,動態分配內存存在類似的情況。如果忘記delete,會導致內存泄漏。它是如何解決的? 在棧上分配對象,要一個特點,那就是離開作用域后,對象肯定要調用析構方法。利用這個特點,可以使用對象對指針封裝,在對象的析構方法中進行delete,就保證了一定會執行delete。這就是智能指針。因為智能指針,不是針對一個特定類型的指針,因此把智能指針設計為類的模版,根據模版實參特例化一個模板類。
同樣道理,也可以使用相同技術,對互斥體封裝。這就是 lock類模版。在lock的構造方法調用互斥體的lock方法,在lock的析構方法調用互斥體的unlock方法。
4、mutex是對象類,lock是模板類。
5、常用的互斥體有:
boost::mutex
boost::timed_mutex
boost::shared_mutex
boost::recursive_mutex
6、lock的類模版有:
boost::unique_lock<T>
boost::shared_lock<T>
對類模版特例化,可以生成不同的lock類。