RAII 有条件锁定

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

我有一段代码,仅当某些条件成立时才需要用锁保护。

if(condition) {

   std::lock_guard<std::mutex> guard(some_mutex);

   // do a bunch of things

} else {

   // do a bunch of things
}

虽然我可以在一个单独的函数中移动所有

// bunch of things 
并调用它,但我想知道是否有一种 RAII 方式允许有条件地获取锁定。

类似的东西

if(condition){

   // the lock is taken
}

// do a bunch of things

// lock is automatically released if it was taken
c++ multithreading locking raii
2个回答
6
投票

您可以切换到使用

std::unique_lock
并使用其
std::defer_lock_t
标记的构造函数。 这将从互斥体解锁开始,但您可以使用其
lock()
方法来锁定互斥体,然后析构函数将释放该互斥体。 这将为您提供如下所示的代码流程:

{
    std::unique_lock<std::mutex> guard(some_mutex, std::defer_lock_t{});
    if (mutex_should_be_locked)
    {
        guard.lock();
    }
    // rest of code 
} // scope exit, unlock will be called if the mutex was locked

0
投票

您可以使用这样的假锁。获取虚拟锁并不重要,因为它是一个局部变量。

 std::shared_mutex dummy_lock;
    std::shared_lock<std::shared_mutex> lock(
        acquire_lock ? original_lock : dummy_lock);
© www.soinside.com 2019 - 2024. All rights reserved.