以下代码使用VS2012 Express和gcc 4.7.2产生不同的输出,这是ideone使用的。为了记录,我尝试使用MinGW编译,但它没有实现C ++ 11的< mutex>如上所述here。
#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
中所示。
哪一个是正确的?
答案 0 :(得分:4)
标准定义了std::unique_lock
构造函数:
unique_lock(mutex_type& m, try_to_lock_t);
要求:提供的互斥锁类型应满足可锁定要求(30.2.5.3)。如果mutex_type不是递归互斥锁,则调用线程不拥有互斥锁。
因此,您违反了该呼叫的要求,因此行为未定义。 (std::mutex
不是递归的。)