簡體   English   中英

為什么在 C++ 中互斥鎖的使用正確?

[英]Why is the usage of mutex correct in C++?

我之前被問過一個關於互斥鎖的問題,代碼工作正常,但我對這個結果感到困惑:

::std::mutex s_mutex;
void funcA()
{
    s_mutex.lock();

    printf( "funcA \n" );

    s_mutex.unlock();
}

void funcB()
{
    s_mutex.lock();

    funcA();

    printf( "funcB \n" );

    s_mutex.unlock();
}

int main()
{
    funcB();

    return 0;
}

它工作正常並打印出我沒有預料到的內容:

funcA 
funcB 

但為什么? 這個函數在主線程中被調用並且似乎調用了兩次鎖。

std::mutex::lock()

如果lock由已經擁有互斥鎖的線程調用,則行為未定義:例如,程序可能死鎖。 鼓勵可以檢測到無效使用的實現拋出帶有錯誤條件resource_deadlock_would_occurstd::system_error而不是死鎖。

正如@Quentin 所提到的,從一個線程多次鎖定std::mutex會導致未定義的行為。 要允許線程多次鎖定互斥鎖 object,您可以使用std::recursive_mutex

遞歸互斥鎖是可鎖定的 object,就像互斥鎖一樣,但允許同一個線程獲得對互斥鎖 object 的多個級別的所有權。

這允許從已經鎖定它的線程鎖定(或嘗試鎖定)互斥鎖 object,獲得對互斥鎖 object 的新級別所有權:互斥鎖 object 將實際保持鎖定狀態,直到擁有該線程的線程被稱為解鎖很多倍於這個級別的所有權。

暫無
暫無

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

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