0

以下代码使用 VS2012 Express 和 gcc 4.7.2 产生不同的输出,这是ideone使用的。作为记录,我尝试使用 MinGW 进行编译,但它没有实现 C++11 的 <mutex> ,如此所述。

#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

1 回答 1

4

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

unique_lock(mutex_type& m, try_to_lock_t);

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

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

于 2013-02-17T12:24:23.637 回答