Skip to content

Latest commit

 

History

History
97 lines (77 loc) · 2.48 KB

mutex.md

File metadata and controls

97 lines (77 loc) · 2.48 KB

#mutex

namespace std {
  class mutex;
}

##概要 mutexは、スレッド間で使用する共有リソースを排他制御するためのクラスである。lock()メンバ関数によってリソースのロックを取得し、unlock()メンバ関数でリソースのロックを手放す。このクラスのデストラクタは自動的にunlock()メンバ関数を呼び出すことはないため、通常このクラスのメンバ関数は直接は呼び出さず、lock_guardのようなクラスと併用する。

###メンバ関数

(constructor) コンストラクタ
(destructor) デストラクタ
operator=(const mutex&) = delete; 代入演算子
lock ロックを取得する
try_lock ロックの取得を試みる
unlock ロックを手放す
native_handle ミューテックスのハンドルを取得する

###メンバ型

native_handle_type 実装依存のハンドル型

###例

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

// std::coutへのアクセスを排他的にする
std::mutex print_mtx_;
void safe_print(int x)
{
  std::lock_guard<std::mutex> lock(print_mtx_);
  std::cout << x << std::endl;
}

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()
  {
    std::lock_guard<std::mutex> lock(mtx_);
    for (int x : data_) {
      safe_print(x);
    }
  }
};

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();
}

###出力

12

##バージョン ###言語

  • C++11

###処理系

###参照