std::mutex
提供: cppreference.com
| ヘッダ <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(オプション)
|
処理系定義 |
[編集] メンバ関数
| ミューテックスを構築します (パブリックメンバ関数) | |
| ミューテックスを破棄します (パブリックメンバ関数) | |
| operator= [削除] |
コピー代入可能ではありません (パブリックメンバ関数) |
ロック | |
| ミューテックスをロックします。 利用可能でない場合はブロックします (パブリックメンバ関数) | |
| ミューテックスのロックを試みます。 利用可能でない場合はリターンします (パブリックメンバ関数) | |
| ミューテックスのロックを解除します (パブリックメンバ関数) | |
ネイティブハンドル | |
| 処理系定義のベースとなるネイティブハンドルオブジェクトを返します (パブリックメンバ関数) | |
[編集] ノート
std::mutex は通常、直接アクセスしません。 std::unique_lock, std::lock_guard, または std::scoped_lock (C++17以上) を使用してより例外安全な方法でロックを管理します。
[編集] 例
この例は2つのスレッド間で共有している std::map を保護するためにどのように mutex を使用できるかを示します。
Run this code
#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) { // 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 &pair : g_pages) { std::cout << pair.first << " => " << pair.second << '\n'; } }
出力:
http://bar => fake content http://foo => fake content

