2016-11-23 65 views
2

我寫了一個簡單的代碼,其中我使用unique_lock並解鎖互斥鎖,而不是調用鎖本身的解鎖。當第一個線程進入臨界區並調用my_mutex.unlock()時,許多其他線程一起進入臨界區。在與unique_lock關聯的互斥鎖中調用解鎖會導致未定義的行爲

std::mutex my_mutex; 
void sample() { 
    std::unique_lock<std::mutex> lock(my_mutex); 
    // Critical section 
    my_mutex.unlock(); 
} 

這是怎麼發生的?在由unique_lock持有的互斥體上調用解鎖是否是錯誤的?謝謝!

回答

4

UB不是由使用std::mutex::unlock的顯式解鎖引起的,而是由退出範圍時由std::unique_lock析構函數執行的第二次解鎖造成的。

從cppreference.com調用std::mutex::unlock時:

互斥量必須執行的當前線程被鎖定,否則,行爲是不確定的。

的解決方案是不執行上互斥明確解鎖。按照預期,讓std::unique_lock在銷燬後自行解鎖。

對於需要在銷燬前釋放鎖的情況,請使用std::unique_lock::unlock,這將允許安全銷燬。或者,您可以簡單地插入額外的範圍,例如

void sample() { 
    // Before. 
    { 
     std::unique_lock<std::mutex> lock(my_mutex); 
     // Critical section. 
    } 
    // After. 
} 
+0

謝謝!其實我在我的實際代碼中沒有本地互斥。我將更新問題中的代碼。 – kwadhwa