带有 std::defer_lock 参数的 std::lock_guard 构造函数

问题描述 投票:0回答:1

我很好奇要传递给 lock_guard 构造函数的第二个参数,特别是如果它等于 std::defer_lock 的话。 由于lock_guard对象没有提供锁定引用的互斥锁的方法,我不明白它如何知道是否应该释放引用的互斥锁。

据我了解,释放不属于调用线程的互斥锁是错误的。

std::mutex sMutex;
std::lock_guard<std::mutex> sGuard(sMutex, std::defer_lock);
if (something)
    sMutex.lock();
c++ c++11 lock-guard
1个回答
0
投票

std::lock_guard
没有
defer_lock_t
过载,它只有
adopt_lock_t
过载。

std::lock_guard
始终获得包装互斥体的所有权并在销毁时将其解锁。

唯一的选择是传递

std::adopt_lock
告诉它不要在构造时锁定互斥体。如果互斥体尚未被调用线程锁定,则程序将具有未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.