最終更新日時(UTC): 2025年07月11日 17時16分44秒
Koichi Murase が更新

履歴 編集

class
<mutex>

# std::mutex(C++11)

    namespace std {
      class mutex;
    }

## 概要

`mutex`は、スレッド間で使用する共有リソースを排他制御するためのクラスである。`lock()`メンバ関数によってリソースのロックを取得し、`unlock()`メンバ関数でリソースのロックを手放す。

このクラスのデストラクタは自動的に`unlock()`メンバ関数を呼び出すことはないため、通常このクラスのメンバ関数は直接は呼び出さず、`lock_guard`や`unique_lock`といったロック管理クラスと併用する。

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++11
`(destructor)` | デストラクタ | C++11
`operator=(const mutex&) = delete;` | 代入演算子 | C++11
`lock` | ロックを取得する | C++11
`try_lock` | ロックの取得を試みる | C++11
`unlock` | ロックを手放す | C++11
`native_handle` | ミューテックスのハンドルを取得する | C++11

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`native_handle_type` | 実装依存のハンドル型 | C++11

## 例

    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <vector>

    class X {
      std::mutex mtx_;
      std::vector<int> data_;
    public:
      // vectorオブジェクトへのアクセスを排他的にする
      void add_value(int value)
      {
        std::lock_guard<std::mutex> lock(mtx_);
        data_.push_back(value);
      }

      void print()
      {
        for (int x : data_) {
          std::cout << x << std::endl;
        }
      }
    };

    int main()
    {
      X x;

      std::thread t1([&x]{ x.add_value(1); });
      std::thread t2([&x]{ x.add_value(2); });

      t1.join();
      t2.join();

      x.print();
    }

### 出力

    1
    2

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2012 ✅, 2013 ✅, 2015 ✅

## 参照