名前空間
変種
操作

std::mutex

From cppreference.com
< cpp‎ | thread
 
 
並行性サポートライブラリ
スレッド
(C++11)
(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++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
std::mutex
 
ヘッダ <mutex> で定義
class mutex;
(C++11以降)

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

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

  • 呼び出し元のスレッドは、lock または try_lock のいずれかを正常に呼び出した時点から、unlock を呼び出すまで mutex所有します。
  • スレッドが mutex を所有している場合、他のすべてのスレッドは、mutex の所有権を要求しようとすると、ブロックされるか(lock の呼び出しの場合)、false の戻り値を受け取ります(try_lock の場合)。
  • 呼び出し元のスレッドは、lock または try_lock を呼び出す前に mutex を所有してはなりません。

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

std::mutex はコピーもムーブもできません。

目次

[編集] 入れ子型

名前 定義
native_handle_type (任意*) 実装定義[編集]

[編集] メンバ関数

ミューテックスを構築します
(public メンバ関数) [編集]
ミューテックスを破棄します
(public メンバ関数) [編集]
operator=
[削除]
コピー代入不可
(public メンバ関数) [編集]
ロック
ミューテックスをロックします。ミューテックスが利用できない場合はブロックします
(public メンバ関数) [編集]
ミューテックスをロックしようとします。ミューテックスが利用できない場合は戻ります
(public メンバ関数) [編集]
ミューテックスをアンロックします
(public メンバ関数) [編集]
ネイティブハンドル
基になる実装定義のネイティブハンドルオブジェクトを返します
(public メンバー関数) [編集]

[編集] 注釈

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

[編集]

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

#include <chrono>
#include <iostream>
#include <map>
#include <mutex>
#include <string>
#include <thread>
 
std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;
 
void save_page(const std::string& url)
{
    // simulate a long page fetch
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::string result = "fake content";
 
    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();
 
    // safe to access g_pages without lock now, as the threads are joined
    for (const auto& [url, page] : g_pages)
        std::cout << url << " => " << page << '\n';
}

出力

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

[編集] 関連項目

同じスレッドによって再帰的にロックできる相互排他機能を提供する
(クラス) [編集]
厳密なスコープベースのミューテックス所有権ラッパーを実装する
(クラステンプレート) [編集]
ムーブ可能なミューテックス所有権ラッパーを実装する
(クラステンプレート) [編集]
デッドロックを回避する、複数のミューテックス用のRAIIラッパー
(クラステンプレート) [編集]
std::unique_lock と関連付けられた条件変数を提供する
(クラス) [編集]
English 日本語 中文(简体) 中文(繁體)