c++ double shared_lock冻结Windows上的程序

0 c++ deadlock readwritelock

当我学习shared_mutexC++17时,我发现一个奇怪的问题。如果我在一个线程中调用两次,然后在另一个线程中shared_lock调用,那么我的程序将冻结。unique_lock像这样:

std::mutex mutex;
std::shared_mutex s_mutex;

int i = 0;

void func() {
    auto lock = std::shared_lock(s_mutex);
    auto lock1 = std::shared_lock(s_mutex);
    ++i;
}

void func2() {
    auto lock = std::unique_lock(s_mutex);
    ++i;
}

int main() {
    auto t1 = std::thread([](){
        auto i = 10000;
        while(i--) {
            func();
        }
    });
    auto t2 = std::thread([](){
        auto i = 10000;
        while(i--) {
            func2();
        }
    });
    t2.join();
    t1.join();
    std::cout << i << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个问题好像只出现在windows上,我在Arch linux上尝试过,效果很好。

我在用着g++.exe (Rev2, Built by MSYS2 project) 12.1.0

我尝试cout在每次锁定后添加:

void func() {
    auto lock = std::shared_lock(s_mutex);
    std::cout << "t1 lock1\n";
    auto lock1 = std::shared_lock(s_mutex);
    std::cout << "t1 lock2\n";
    ++i;
}
Run Code Online (Sandbox Code Playgroud)

然后我发现它总是在之后冻结t1 lock1\n,所以我尝试进入lock1的构造函数,我发现它在这个函数之后冻结:

static inline int
__gthread_active_p (void)
{
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

但我不知道为什么。提前致谢。

use*_*522 5

尝试在已持有互斥锁的线程中再次锁定互斥锁具有未定义的行为。

这适用于除 之外的所有互斥体类型recursive*