我很好奇要传递给 lock_guard 构造函数的第二个参数,特别是如果它等于 std::defer_lock 的话。 由于lock_guard对象没有提供锁定引用的互斥锁的方法,我不明白它如何知道是否应该释放引用的互斥锁。
据我了解,释放不属于调用线程的互斥锁是错误的。
std::mutex sMutex;
std::lock_guard<std::mutex> sGuard(sMutex, std::defer_lock);
if (something)
sMutex.lock();
std::lock_guard
没有 defer_lock_t
过载,它只有 adopt_lock_t
过载。
std::lock_guard
始终获得包装互斥体的所有权并在销毁时将其解锁。
唯一的选择是传递
std::adopt_lock
告诉它不要在构造时锁定互斥体。如果互斥体尚未被调用线程锁定,则程序将具有未定义的行为。