名前空間
変種
操作

std::mutex

提供: cppreference.com
< cpp‎ | thread
 
 
スレッドサポートライブラリ
スレッド
(C++11)
(C++20)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
mutex
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
std::mutex
メンバ関数
ロック
ネイティブハンドル
 
ヘッダ <mutex> で定義
class mutex;
(C++11以上)

mutex クラスは複数のスレッドによる同時アクセスから共有データを保護するために使用できる同期プリミティブです。

mutex は排他的で非再帰的な所有権のセマンティクスを提供します。

  • 呼び出し元スレッドは、 lock または try_lock のいずれかを呼んで成功してから unlock を呼ぶまでの間、 mutex所有します。
  • スレッドが mutex を所有しているとき、他のすべてのスレッドは、 mutex の所有権の取得を試みた場合、 (lock の呼び出しに対して) ブロックされるか、 (try_lock に対して) false の戻り値を受け取ります。
  • 呼び出し元スレッドは、 lock または try_lock を呼ぶとき、その mutex をすでに所有していてはなりません。

いずれかのスレッドによって未だ所有されている mutex を破棄したり、 mutex を所有しているスレッドが実行終了した場合、プログラムの動作は未定義です。 mutex クラスは Mutex および StandardLayoutType の要件をすべて満たします。

std::mutex はコピー可能でもムーブ可能でもありません。

目次

[編集] メンバ型

メンバ型 定義
native_handle_type(オプション) 処理系定義

[編集] メンバ関数

ミューテックスを構築します
(パブリックメンバ関数) [edit]
ミューテックスを破棄します
(パブリックメンバ関数) [edit]
operator=
[削除]
コピー代入可能ではありません
(パブリックメンバ関数) [edit]
ロック
ミューテックスをロックします。 利用可能でない場合はブロックします
(パブリックメンバ関数) [edit]
ミューテックスのロックを試みます。 利用可能でない場合はリターンします
(パブリックメンバ関数) [edit]
ミューテックスのロックを解除します
(パブリックメンバ関数) [edit]
ネイティブハンドル
処理系定義のベースとなるネイティブハンドルオブジェクトを返します
(パブリックメンバ関数) [edit]

[編集] ノート

std::mutex は通常、直接アクセスしません。 std::unique_lock, std::lock_guard, または std::scoped_lock (C++17以上) を使用してより例外安全な方法でロックを管理します。

[編集]

この例は2つのスレッド間で共有している std::map を保護するためにどのように mutex を使用できるかを示します。

#include <iostream>
#include <map>
#include <string>
#include <chrono>
#include <thread>
#include <mutex>
 
std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;
 
void save_page(const std::string &url)
{
    // ページの読み込みに時間がかかるのをシミ��レートしています。
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::string result = "fake content";
 
    // ミューテックスをロックして g_pages にアクセスします。
    std::lock_guard<std::mutex> guard(g_pages_mutex);
    g_pages[url] = result;
}
 
int main() 
{
    std::thread t1(save_page, "http://foo");
    std::thread t2(save_page, "http://bar");
    t1.join();
    t2.join();
 
    // スレッドが join 済みであるため、ロックなしで g_pages にアクセスしても安全です。
    for (const auto &pair : g_pages) {
        std::cout << pair.first << " => " << pair.second << '\n';
    }
}

出力:

http://bar => fake content
http://foo => fake content