![](/img/trans.png)
[英]why lock_guard can get an already locked mutex by unique_lock? - still questions
[英]why lock_guard can get an already locked mutex by unique_lock?
我讀使用的示例代碼condition_variable
這里 。 我發布以下代碼:
std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
void worker_thread()
{
// Wait until main() sends data
std::cout << "------------------------\n";
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return ready;});
// after the wait, we own the lock.
std::cout << "Worker thread is processing data\n";
data += " after processing";
// Send data back to main()
processed = true;
std::cout << "Worker thread signals data processing completed\n";
// Manual unlocking is done before notifying, to avoid waking up
// the waiting thread only to block again (see notify_one for details)
lk.unlock();
cv.notify_one();
}
int main()
{
std::thread worker(worker_thread);
data = "Example data";
// send data to the worker thread
{
std::lock_guard<std::mutex> lk(m);
ready = true;
std::cout << "main() signals data ready for processing\n";
}
cv.notify_one();
// wait for the worker
{
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return processed;});
}
std::cout << "Back in main(), data = " << data << '\n';
worker.join();
return 0;
}
我的問題是worker_thread
首先啟動,因此我假設互斥鎖m
被worker_thread
鎖定了,但是為什么在main
互斥鎖m
仍然可以被lock_guard
鎖定?
條件變量只是三腳架的一部分。
這三個部分是條件變量,狀態和保護狀態的互斥量。
條件變量提供了一種在狀態更改時發出通知的機制。
此操作使用所有3:
cv.wait(lk, []{return ready;})
條件變量的方法需要一個鎖(必須已獲取)和一個lambda(用於測試狀態)。
在wait
方法中, lk
被解鎖,直到條件變量檢測到消息(可能是虛假的)為止。 當檢測到消息時,它將重新鎖定互斥鎖並運行測試(其目的是確定檢測是否是虛假的)。 如果測試失敗,它將解鎖並再次等待:如果測試通過,它將保持鎖定並退出。
還有一個“測試拋出”路徑,根據您所實現的代碼的標准版本(C ++ 11有一個缺陷,IIRC),它會導致不同的鎖定狀態。
您錯過的重要一件事是, wait
解鎖傳入的互斥量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.