lock_guard和unique_lock都是RAII機制下的鎖,即依靠對象的創(chuàng)建和銷毀也就是其生命周期來自動實現(xiàn)一些邏輯,而這兩個對象就是在創(chuàng)建時自動加鎖,在銷毀時自動解鎖。所以如果僅僅是依靠對象生命周期實現(xiàn)加解鎖的話,兩者是相同的,都可以用,因跟生命周期有關(guān),所以有時會用花括號指定其生命周期。但lock_guard的功能僅限于此。unique_lock是對lock_guard的擴展,允許在生命周期內(nèi)再調(diào)用lock和unlock來加解鎖以切換鎖的狀態(tài)。
根據(jù)linux下條件變量的機制,condition_variable在wait成員函數(shù)內(nèi)部會先調(diào)用參數(shù)unique_lock的unlock臨時解鎖,讓出鎖的擁有權(quán)(以讓其它線程獲得該鎖使用權(quán)加鎖,改變條件,解鎖),然后自己等待notify信號,等到之后,再調(diào)用參數(shù)unique_lock的lock加鎖,處理相關(guān)邏輯,最后unique_lock對象銷毀時自動解鎖。
也即是說condition_variable的wait函數(shù)內(nèi)偽代碼如下:
condition_variable::wait(std::unique_lock<std::mutex>&?lk){
??????lk.unlock();
??????waiting_signal();
??????lk.lock();
}