即使锁失败,带有try_to_lock的unique_lock是否应该拥有互斥锁?

时间:2013-02-17 12:17:46

标签: c++ gcc visual-studio-2012 mutex

以下代码使用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中所示。

哪一个是正确的?

1 个答案:

答案 0 :(得分:4)

标准定义了std::unique_lock构造函数:

unique_lock(mutex_type& m, try_to_lock_t);
     

要求:提供的互斥锁类型应满足可锁定要求(30.2.5.3)。如果mutex_type不是递归互斥锁,则调用线程不拥有互斥锁

因此,您违反了该呼叫的要求,因此行为未定义。 (std::mutex不是递归的。)