2013-02-17 96 views
0

以下代碼導致VS2012 Express和gcc 4.7.2的不同輸出,這是ideone使用的輸出。爲了記錄,我試着用MinGW編譯,但它沒有實現C++ 11的<互斥體>,如here所述。即使鎖定失敗,應使用try_to_lock的unique_lock是否擁有互斥鎖?

#include <mutex> 
#include <iostream> 

int main() 
{ 
    std::mutex m; 
    { 
      std::unique_lock<std::mutex> l(m, std::try_to_lock); 
      std::cout << (bool)l <<std::endl; 
    } 
    { 
      m.lock(); 
      std::unique_lock<std::mutex> l(m, std::try_to_lock); 
      std::cout << (bool)l <<std::endl; 
    } 
} 

在visual studio中,第二個測試打印0,這意味着鎖不擁有互斥鎖,因爲它已經被鎖定。

使用gcc,第二次測試會打印1,表示即使已經鎖定,該鎖也獲得了互斥量,如std::adopt_lock

哪一個是正確的?

回答

4

該標準定義了std::unique_lock構造器:

unique_lock(mutex_type& m, try_to_lock_t); 

要求:供給的互斥型應符合可鎖定要求(30.2.5.3)。如果mutex_type不是遞歸互斥體,則調用線程不擁有該互斥體

因此,由於您違反了該調用的要求,因此行爲未定義。 (std::mutex不是遞歸的。)