Namespaces
Variants

std:: mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
mutex
(C++11)
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
定義済みヘッダー <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 ( オプション* ) 実装定義

メンバー関数

ミューテックスを構築する
(public member function)
ミューテックスを破棄する
(public member function)
operator=
[deleted]
コピー代入不可
(public member function)
ロック操作
ミューテックスをロックする。利用できない場合はブロックする
(public member function)
ミューテックスのロックを試みる。利用できない場合は即時返る
(public member function)
ミューテックスをアンロックする
(public member function)
ネイティブハンドル
基盤となる実装定義のネイティブハンドルオブジェクトを返す
(public member function)

注記

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

この例は、 mutex を使用して、2つのスレッド間で共有される std::map を保護する方法を示しています。

#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

関連項目

同じスレッドで再帰的にロック可能な相互排他機能を提供する
(クラス)
(C++11)
厳密なスコープベースのミューテックス所有権ラッパーを実装する
(クラステンプレート)
移動可能なミューテックス所有権ラッパーを実装する
(クラステンプレート)
複数のミューテックスに対するデッドロック回避RAIIラッパー
(クラステンプレート)
std::unique_lock と関連付けられた条件変数を提供する
(クラス)