std::mutex
From cppreference.com
| ヘッダ <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_lock、std::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
[編集] 関連項目
| (C++11) |
同じスレッドによって再帰的にロックできる相互排他機能を提供する (クラス) |
| (C++11) |
厳密なスコープベースのミューテックス所有権ラッパーを実装する (クラステンプレート) |
| (C++11) |
ムーブ可能なミューテックス所有権ラッパーを実装する (クラステンプレート) |
| (C++17) |
デッドロックを回避する、複数のミューテックス用のRAIIラッパー (クラステンプレート) |
| (C++11) |
std::unique_lock と関連付けられた条件変数を提供する (クラス) |