最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<mutex>

# std::scoped_lock::コンストラクタ(C++17)

    explicit scoped_lock(MutexTypes&... m);               // (1)
    explicit scoped_lock(adopt_lock_t, MutexTypes&... m); // (2)

    scoped_lock(const scoped_lock&) = delete;             // (3)

## 概要

- (1) : 非ロック状態のミューテックスオブジェクトへの参照を複数受け取り、メンバ変数として参照を保持する。
- (2) : ロック取得済みミューテックスオブジェクトへの参照を複数受け取り、メンバ変数として参照を保持する。
- (3) : コピーコンストラクタ。コピー不可。非トリビアルなコンストラクタが定義されているため、ムーブコンストラクタは定義されない

## 効果

- (1) : `MutexTypes...`が空であればなにもしない。単一要素であれば`m.lock()`を呼び出し、そうでなければ`lock(m...)`を呼び出す。

## 例外

- (2) : 投げない

## 例

    #include <iostream>
    #include <mutex>

    int main()
    {
      std::mutex m1;
      std::timed_mutex m2;

      // (1)
      {
        // m1とm2のロックを取得
        std::scoped_lock<std::mutex, std::timed_mutex> lk{m1, m2};

        // ...共有リソースにアクセス...

      } // ロックを手放す

      // (2)
      {
        m1.lock();
        m2.lock();

        // ロック取得済みのミューテックスを、std::scoped_lockに管理させる
        std::scoped_lock lk(std::adopt_lock, m1, m2);

        // ...共有リソースにアクセス...

      } // ロックを手放す
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang: 5.0 ✅
- GCC: 7.3 ✅
- Visual C++: ??