std::mutex
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <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