当我学习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)
但我不知道为什么。提前致谢。