我可以在同一线程中的shared_lock和unique_lock之间共享互斥锁吗?

The*_*ind 5 c++ multithreading mutex c++17

考虑以下函数:

 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 ...
 }
Run Code Online (Sandbox Code Playgroud)

std::unique_lock最初,该函数的所有部分都只有一个。它工作得很好,但作为优化的一部分,它用 a 包裹了一些部分std::shared_lock。对我来说,它看起来完全合法,但在使用它之后,结果发现一些死锁开始出现(不一定在函数中,但很明显,这种变化是问题的根本原因)

任何人都可以详细说明这种方法是否定义良好以及为什么它会导致出现死锁问题?

rus*_*tyx 7

您似乎正在尝试将共享锁升级为唯一锁。你做错了——std::shared_mutex不是递归的,也不是可升级的。先释放共享锁,然后再正常加独占锁。

std::shared_mutex mutex;

void foo()
{
    {
        std::shared_lock readLock{ mutex };
        // ...
        // read-only part of the function
        // ...
    }
    {
        std::unique_lock writeLock{ mutex };
        // ...
        // read/write part
        // ...
    }
    // ... some other read part ...
}
Run Code Online (Sandbox Code Playgroud)

std::upgrade_lock提案中有一个N3568,但它没有进入标准。