簡體   English   中英

Std::Lock 避免了死鎖,但是這個程序卡住了

[英]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_locklock1lock2 )都沒有意識到這一點,因此它們無法解鎖互斥鎖。

因此,當func1結束時,兩個互斥鎖仍處於鎖定狀態,並且func2無法繼續通過std::lock(m1, m2)行。

為什么固定代碼有效?

當您調用std::lock(lock1, lock2)時, std::unique_lock s( lock1lock2 )知道這一點 - 它們現在擁有鎖,並負責解鎖它們(當它們 go 超出范圍時會發生這種情況)。

因此,當func1結束時,兩個互斥鎖都被解鎖,並且func2可以繼續通過std::lock(lock1, lock2)行。 一切都很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM