unique_lock condition_variable 1:lock_guard 和 unique_lock 2:condition_variable wait 和 notify_all 方式1 std::mutex mtx; mtx.lock(); .. ... mtx.unlock();/ ...
unique_lock condition_variable
1:lock_guard 和 unique_lock
2:condition_variable wait 和 notify_all
方式1
std::mutex mtx;
mtx.lock();
..
...
mtx.unlock();//
容易出現死鎖
方式2
lock_gurad<std::mutex> lock(mtx)
出作用域,自動析構(釋放鎖),缺陷:不能用在函數參數傳遞或者返回過程中.
只能用在簡單的臨界區代碼段的互斥操作中.
方式3
unique_lock不僅可以使用在簡單的臨界代碼段的互斥操作中,還可以使用在函數調用過程中
unique_lock<std::mutex>(mtx)
關於condition_variable cv
cv.wait(unique_lock);// 會做兩件事1:使線程進入等待狀態 2:unique_lock.unlock 把mtx給釋放掉
所以簡單的場景,不涉及線程通信時,可以使用 lock_guard, 但是涉及函數調用或線程通信時 使用 unique_lock
關於cv.notify_all() 是通知在cv上等待的線程,條件成立里,可以起來幹活了,其他在cv上等待的線程,從等待狀態=>阻塞狀態=》去搶奪鎖=》搶到鎖後開始運行