【发布时间】:2017-05-31 10:51:34
【问题描述】:
在很多地方都有使用 std::defer_lock 的建议:
{
std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock);
std::unique_lock<std::mutex> lk2(mutex2, std::defer_lock);
std::lock(lk1, lk2);
//Do some stuff
}
但如果我不使用 std::defer_lock 并尝试简单地这样做会怎样:
{
std::unique_lock<std::mutex> lk1(mutex1);
std::unique_lock<std::mutex> lk2(mutex2);
//Do some stuff
}
据我所知,这段代码将锁定 mutex1,然后锁定 mutex2。解锁将以相反的顺序执行 - mutex2,然后是 mutex1。没有理由陷入僵局。
文档说 std::lock(lk1, lk2);在第一个示例中,将同时锁定互斥锁。那么,这是某种优化吗?
【问题讨论】:
-
在这种情况下,应该不需要
std::lock所做的死锁避免。
标签: c++ multithreading c++11 mutex