使用 C++ lock_guard 时如何收紧范围?

How to tighten the scope when using C++ lock_guard?

在 C++ 中,lock_guard 允许您在使用锁时符合 RAII。它在构造 lock_guard 时调用 lock(),一旦它超出范围就会在销毁它时调用 unlock()

是否可以收紧 lock_guard 的范围,以便更快地销毁它,以避免持有锁的时间过长?

我不是 100% 确定你的意思,但是你可以像这样用大括号为 std::lock_guard 引入一个块作用域:

void foo()
{
    // do uncritical stuff

    { 
        // critical part starts here with construction
        std::lock_guard<std::mutex> myLock(someMutex);

        // do critical stuff
    } // critical parts end here with myLock going out of scope

    // do uncritical stuff
}

可以使用 unique_lock 守卫代替 lock_guardunique_lock 为您提供与 lock_guard 相同的 RAII 保证(在构建 lock_guard 时调用 lock(),在销毁时调用 unlock()),以及公开 lock()unlock() 允许您自己锁定和解锁。

使用 unique_lock,您可以在关键路径之前 lock(),然后直接 unlock()

unique_lock 只会在析构函数中调用 unlock() 如果之前已获取锁,因此没有两次释放锁的风险(这会导致未定义的行为)。