考虑以下函数:
std::shared_mutex mutex;
void foo() {
std::shared_lock readLock{ mutex };
// ...
// read-only part of the function
// ...
{
std::unique_lock lock{ mutex, std::adopt_lock }
// ...
// read/write part
// ...
}
// ... some other read part ...
}
最初,该函数只有一个std::unique_lock
用于其所有部分。它运行良好,但作为优化的一部分,它的某些部分被包装在std::shared_lock
中。对我来说,这看起来完全合法,但在尝试后发现,一些死锁开始出现(不一定是在函数中,但显然这个改变是问题的根本原因)
请问是否有人能够详细说明这种方法是否定义良好,以及为什么会导致死锁问题的出现?