[英]How to try_lock on a boost::unique_lock<boost::mutex>
[英]Should unique_lock with try_to_lock owns the mutex even if lock fails?
以下代碼在VS2012 Express和gcc 4.7.2中產生了不同的輸出,這是ideone使用的輸出。 為了記錄在案,我試着用MinGW的編譯,但表示它沒有實現C ++ 11的<互斥> 這里 。
#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
。
哪一個是正確的?
該標准使用以下命令定義了std::unique_lock
構造函數:
unique_lock(mutex_type& m, try_to_lock_t);
要求:提供的Mutex類型必須符合Lockable要求(30.2.5.3)。 如果mutex_type不是遞歸互斥體, 則調用線程不擁有該互斥體 。
因此,行為是不確定的,因為您違反了該調用的要求。 ( std::mutex
不是遞歸的。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.