std::mutex::try_lock
提供: cppreference.com
bool try_lock(); |
(C++11以上) | |
ミューテックスのロックを試みます。 すぐに戻ります。 ロックの取得に成功した場合は true を返し、そうでなければ false を返します。
この関数は、ミューテックスが現在いかなる他のスレッドにもロックされていなくても、 spurious に失敗して false を返すことが認められています。
その mutex をすでに所有しているスレッドによって try_lock が呼ばれた場合、動作は未定義です。
true を返した場合、同じミューテックスに対する以前の unlock() 操作は、この操作に対して同期します (std::memory_order を参照してください)。 false を返した場合は同期されないことに注意してください。
引数
(なし)
戻り値
ロックの取得に成功した場合は true、そうでなければ false。
例外
(なし)
例
Run this code
#include <chrono>
#include <mutex>
#include <thread>
#include <iostream> // std::cout
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)
関連項目
| ミューテックスをロックします。 利用可能でない場合はブロックします (パブリックメンバ関数) | |
| ミューテックスのロックを解除します (パブリックメンバ関数) | |
mtx_trylock の C言語リファレンス
| |