[英]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
但為什么? 這個函數在主線程中被調用並且似乎調用了兩次鎖。
如果
lock
由已經擁有互斥鎖的線程調用,則行為未定義:例如,程序可能死鎖。 鼓勵可以檢測到無效使用的實現拋出帶有錯誤條件resource_deadlock_would_occur
的std::system_error
而不是死鎖。
正如@Quentin 所提到的,從一個線程多次鎖定std::mutex
會導致未定義的行為。 要允許線程多次鎖定互斥鎖 object,您可以使用std::recursive_mutex 。
遞歸互斥鎖是可鎖定的 object,就像互斥鎖一樣,但允許同一個線程獲得對互斥鎖 object 的多個級別的所有權。
這允許從已經鎖定它的線程鎖定(或嘗試鎖定)互斥鎖 object,獲得對互斥鎖 object 的新級別所有權:互斥鎖 object 將實際保持鎖定狀態,直到擁有該線程的線程被稱為解鎖很多倍於這個級別的所有權。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.