最終更新日時:
が更新

履歴 編集

function
<mutex>

std::mutex::コンストラクタ(C++11)

constexpr mutex() noexcept;   // (1)
mutex(const mutex&) = delete; // (2)

mutexオブジェクトの構築

  • (1) : デフォルトコンストラクタ。mutexオブジェクトの初期化を行う。
  • (2) : コピーコンストラクタ。コピー不可。

例外

この関数は、以下のerror conditionを持つsystem_error例外オブジェクトを送出する可能性がある:

備考

非自明なコンストラクタが定義されるため、ムーブコンストラクタは定義されない。

デフォルトコンストラクタにconstexprが付加されていることにより、mutexクラスのオブジェクトは他のスレッド開始よりも前に初期化されることが保証される。

以下の例はconstexprが付加されていない場合にはおそらく動作しない。

// file a.cpp
#include <iostream>
#include <mutex>

std::mutex mutexA;
extern std::mutex mutexB;

class A {
public:
  A() {
    // デフォルトコンストラクタがconstexprでない場合、
    // 別のファイルで定義されているmutexBはこの時点では
    // 初期化されていないかもしれない。
    mutexB.lock();
    std::cout << "A" << std::endl;
    mutexB.unlock();
  }
} glbA;

int main()
{
}

// file b.cpp
#include <iostream>
#include <mutex>

std::mutex mutexB;
extern std::mutex mutexA;

class B {
public:
  B() {
    // デフォルトコンストラクタがconstexprでない場合、
    // 別のファイルで定義されているmutexAはこの時点では
    // 初期化されていないかもしれない。
    mutexA.lock();
    std::cout << "B" << std::endl;
    mutexA.unlock();
  }
} glbB;

出力

A
B

B
A

バージョン

言語

  • C++11

処理系

  • Clang: ??
  • GCC:
  • GCC, C++11 mode: 4.7.0
  • ICC: ??
  • Visual C++: 11.0, 12.0, 14.0
    • 11.0, 12.0, 14.0は、デフォルトコンストラクタにconstexprが修飾されていない。
    • 11.0はコピーコンストラクタのdeleteに対応していないため、代わりにprivateで宣言のみ行う手法で代用されている。

参照