![](/img/trans.png)
[英]why lock_guard can get an already locked mutex by unique_lock?
[英]why lock_guard can get an already locked mutex by unique_lock? - still questions
我正在研究这个例子 。 我已经找到了这个问题,并认为我会得到答案,但是我仍然有一个问题。
为了方便起见,我将代码发布在这里:
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;
}
语句std::unique_lock<std::mutex> lk(m);
阻塞主线程,因为互斥锁m
被worker_thread
锁定了吗? 如果是,则不是语句cv.wait(lk, []{return processed;});
在这个例子中没有必要吗? 当主线程可以锁定互斥锁时,已processed
为true。
wait
的调用会在wait
解锁互斥锁。 请参阅http://en.cppreference.com/w/cpp/thread/condition_variable/wait 。
编辑:在您链接到的问题的答案中明确指出: https : //stackoverflow.com/a/32030975/212870
编辑2:并非“当主线程可以锁定互斥锁时,已processed
为真”。 工作线程甚至可能尚未启动,或者如果尚未启动,则可能尚未设置ready
。
第cv.wait(lk, []{return ready;});
如果ready
为false
则执行以下操作:
解锁互斥锁lk
阻止线程等待通知
通知到达时,取消阻塞线程并锁定互斥锁lk
因此,主线程不会在std::lock_guard<std::mutex> lk(m);
上阻塞std::lock_guard<std::mutex> lk(m);
因为互斥锁是通过工作线程解锁的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.