0

次のコードは、VS2012Expressとgcc4.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では、2番目のテストは0を出力します。これは、ロックが既にロックされているため、ロックがミューテックスを所有していないことを意味します。

gccを使用すると、2番目のテストは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 に答える