std::mutex:: try_lock
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
|
mutex::try_lock
|
||||
| Native handle | ||||
|
bool
try_lock
(
)
;
|
(C++11以降) | |
ミューテックスのロックを試みます。即座に返ります。ロックの取得に成功した場合は true を返し、それ以外の場合は false を返します。
この関数は偽の失敗を起こす可能性があり、他のスレッドによってミューテックスが現在ロックされていない場合でも false を返すことがあります。
もし
try_lock
が既に
mutex
を所有しているスレッドによって呼び出された場合、その動作は未定義です。
同じミューテックスに対する前回の unlock() 操作は( std::memory_order で定義される通り)この操作が true を返す場合、 synchronizes-with 関係を持つ。なお、前回の lock() 操作は、この操作が false を返す場合にはsynchronizes-with関係を持たない。
目次 |
パラメータ
(なし)
戻り値
true ロックの取得が成功した場合、それ以外の場合は false 。
例外
例外を送出しません。
例
#include <chrono> #include <iostream> // std::cout #include <mutex> #include <thread> std::chrono::milliseconds interval(100); std::mutex mutex; int job_shared = 0; // 両スレッドが 'job_shared' を変更可能 // mutex がこの変数を保護 int job_exclusive = 0; // 1つのスレッドのみが 'job_exclusive' を変更可能 // 保護は不要 // このスレッドは 'job_shared' と 'job_exclusive' の両方を変更可能 void job_1() { std::this_thread::sleep_for(interval); // 'job_2' にロックを取得させる while (true) { // 'job_shared' を変更するために mutex のロックを試行 if (mutex.try_lock()) { std::cout << "job shared (" << job_shared << ")\n"; mutex.unlock(); return; } else { // 'job_shared' を変更するためのロックを取得できず // ただし他に実行する作業がある ++job_exclusive; std::cout << "job exclusive (" << job_exclusive << ")\n"; std::this_thread::sleep_for(interval); } } } // このスレッドは 'job_shared' のみ変更可能 void job_2() { mutex.lock(); std::this_thread::sleep_for(5 * interval); ++job_shared; mutex.unlock(); } int main() { std::thread thread_1(job_1); std::thread thread_2(job_2); thread_1.join(); thread_2.join(); }
出力例:
job exclusive (1) job exclusive (2) job exclusive (3) job exclusive (4) job shared (1)
関連項目
|
ミューテックスをロックする。利用できない場合はブロックする
(公開メンバ関数) |
|
|
ミューテックスをアンロックする
(公開メンバ関数) |
|
|
Cドキュメント
for
mtx_trylock
|
|