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) { // ページの読み込みに時間がかかるのをシミ��レートしています。 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