2015-09-07 94 views
2

下面是代碼互斥鎖操作是否應該拋出一個system_error來鎖定兩次?

mutex mtx; 
try{ 
    mtx.lock(); 
    mtx.lock(); 
}catch(system_error& e){ 
    mtx.unlock(); 
    cout << e.what() << '\n'; 
    cout << e.code() << '\n'; 
} 

輸出device or resource busy, generic: 16預期,但從來沒有見過。

gcc版本4.8.4

p.s.

上面的代碼來自Bjarne Stroustrup的書--C++編程語言42.3.1.2互斥錯誤。根據這本書,應該出現一個system_error。關於「未定義行爲」的問題發佈於2012年,甚至在本書出版之前。

+0

重複你爲什麼想到要拋出'system_error'? – juanchopanza

+0

[在這裏沒有關於拋出異常的東西](http://en.cppreference.com/w/cpp/thread/mutex) – user4581301

+4

「如果鎖被一個已經擁有互斥鎖的線程調用,未定義:程序*可能*死鎖,或者,如果實現可以檢測到死鎖,則可能會拋出resource_deadlock_would_occur錯誤條件。「 – melak47

回答

2

這是未定義的行爲。如果我們看一下[mutex.requirements.mutex],它的前提條件是調用線程不是擁有該互斥量,以及調用線程確實擁有該互斥量的後置條件device_or_resource_busy與另一個調用線程嘗試鎖定互斥鎖有關。但是,執行定義是否引發resource_deadlock_would_occur

這個問題的Why is locking a std::mutex twice 'Undefined Behaviour'?