std::mutex::lock
提供: cppreference.com
void lock(); |
(C++11以上) | |
ミューテックスをロックします。 別のスレッドがミューテックスをすでにロックしている場合、 lock の呼び出しはロックを取得するまで実行をブロックします。
その mutex をすでに所有しているスレッドによって lock が呼ばれた場合、動作は未定義です。 例えば、プログラムがデッドロックするかもしれません。 無効な使用方法を検出できる処理系は、デッドロックする代わりにエラーコンディション resource_deadlock_would_occur を持つ std::system_error を投げることが推奨されます。
同じミューテックスに対する以前の unlock() 操作は、この操作に対して同期します (std::memory_order を参照してください)。
引数
(なし)
戻り値
(なし)
例外
エラーが発生した場合は std::system_error が投げられます。 ベースとなる OS の仕様によって lock が妨げられたことによるエラーもこれに含まれます。 何らかの例外が投げられた場合、ミューテックスはロックされません。
ノート
通常、 lock() は直接呼ばれません。 排他ロックを管理するために std::unique_lock および std::lock_guard が使用されます。
例
この例は共有データを保護するためにどのように lock と unlock を使用できるかを示します。
Run this code
#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
int g_num = 0; // protected by g_num_mutex
std::mutex g_num_mutex;
void slow_increment(int id)
{
for (int i = 0; i < 3; ++i) {
g_num_mutex.lock();
++g_num;
std::cout << id << " => " << g_num << '\n';
g_num_mutex.unlock();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
std::thread t1(slow_increment, 0);
std::thread t2(slow_increment, 1);
t1.join();
t2.join();
}
出力例:
0 => 1
1 => 2
0 => 3
1 => 4
0 => 5
1 => 6
関連項目
| ミューテックスのロックを試みます。 利用可能でない場合はリターンします (パブリックメンバ関数) | |
| ミューテックスのロックを解除します (パブリックメンバ関数) | |
mtx_lock の C言語リファレンス
| |