[英]Std::Lock avoids deadlock but this program gets stuck
全部,參考std::lock 中的問題仍然導致死鎖
我仍然無法弄清楚以下代碼中的問題。 有人可以解釋這個問題以及如何解決這個問題嗎? 為什么會掛? 請幫忙。
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
std::mutex m1;
std::mutex m2;
void func1()
{
std::unique_lock<std::mutex> lock1(m1, std::defer_lock);
printf("func1 lock m1\n");
std::this_thread::sleep_for(std::chrono::seconds(1));
std::unique_lock<std::mutex> lock2(m2, std::defer_lock);
printf("func1 lock m2\n");
std::lock(m1, m2);
printf("func1 std lock\n");
}
void func2()
{
std::unique_lock<std::mutex> lock1(m2, std::defer_lock);
printf("func2 lock m2\n");
std::this_thread::sleep_for(std::chrono::seconds(1));
std::unique_lock<std::mutex> lock2(m1, std::defer_lock);
printf("func2 lock m1\n");
std::lock(m1, m2);
printf("func2 std lock\n");
}
int main(int argc,char* argv[])
{
std::thread th1(func1);
std::thread th2(func2);
th1.join();
th2.join();
return 0;
}
Output 看到: func1 lock m1
func2鎖m2
func1鎖m2
func1 標准鎖
func2鎖m1
-----掛在這里。
即使 func1 已經釋放了兩個互斥體,為什么 func2 不繼續?
代替:
std::lock(m1, m2);
利用:
std::lock(lock1, lock2);
更多詳細信息(包括示例)可以在std::lock
的參考頁面上找到。
當您調用std::lock(m1, m2)
時,兩個互斥鎖被直接鎖定。 std::unique_lock
( lock1
和lock2
)都沒有意識到這一點,因此它們無法解鎖互斥鎖。
因此,當func1
結束時,兩個互斥鎖仍處於鎖定狀態,並且func2
無法繼續通過std::lock(m1, m2)
行。
當您調用std::lock(lock1, lock2)
時, std::unique_lock
s( lock1
和lock2
)知道這一點 - 它們現在擁有鎖,並負責解鎖它們(當它們 go 超出范圍時會發生這種情況)。
因此,當func1
結束時,兩個互斥鎖都被解鎖,並且func2
可以繼續通過std::lock(lock1, lock2)
行。 一切都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.