std::mutex::try_lock
From cppreference.com
| bool try_lock(); |
(C++11以降) | |
ミューテックスのロックを試みます。すぐに返します。ロックの取得に成功した場合は true を返し、それ以外の場合は false を返します。
この関数は、ミューテックスが現在他のスレッドによってロックされていなくても、偶発的に失敗して false を返すことがあります。
try_lock が、既に mutex を所有しているスレッドによって呼び出された場合、その動作は未定義です。
同じミューテックスに対する以前の unlock() 操作は、この操作が true を返す場合、std::memory_order で定義されるように synchronizes-with(同期します)します。以前の lock() は、この操作が false を返す場合、この操作とは同期しないことに注意してください。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
ロックが正常に取得された場合は true、それ以外の場合は false。
[編集] 例外
何もスローしません。
[編集] 例
このコードを実行
#include <chrono> #include <iostream> // std::cout #include <mutex> #include <thread> std::chrono::milliseconds interval(100); std::mutex mutex; int job_shared = 0; // both threads can modify 'job_shared', // mutex will protect this variable int job_exclusive = 0; // only one thread can modify 'job_exclusive' // no protection needed // this thread can modify both 'job_shared' and 'job_exclusive' void job_1() { std::this_thread::sleep_for(interval); // let 'job_2' take a lock while (true) { // try to lock mutex to modify 'job_shared' if (mutex.try_lock()) { std::cout << "job shared (" << job_shared << ")\n"; mutex.unlock(); return; } else { // can't get lock to modify 'job_shared' // but there is some other work to do ++job_exclusive; std::cout << "job exclusive (" << job_exclusive << ")\n"; std::this_thread::sleep_for(interval); } } } // this thread can modify only '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)
[編集] 関連項目
| ミューテックスをロックします。ミューテックスが利用できない場合はブロックします (public メンバ関数) | |
| ミューテックスをアンロックします (public メンバ関数) | |
| C言語のドキュメント for mtx_trylock
| |