std::timed_mutex::try_lock_until
template< class Clock, class Duration > bool try_lock_until( const std::chrono::time_point<Clock,Duration>& timeout_time ); |
(C++11以上) | |
ミューテックスのロックを試みます。 指定された timeout_time に達するか、ロックを取得するか、どちらかが先に発生するまでブロックします。 ロックの取得に成功した場合は true を返し、そうでなければ false を返します。
timeout_time がすでに過ぎていれば、この関数は try_lock() のように動作します。
timeout_time に紐付く時計が使用されます。 つまり、その時計の調節の影響を受けます。 そのため、ブロックする最大時間は、調節の方向によって、呼び出したときの timeout_time - Clock::now() より、短くなったり長くなったりする場合があります。 また、スケジューリングやリソースの奪い合いによる遅延のため、この関数は timeout_time に達するまでよりも長くブロックする可能性もあります。
try_lock() と同様に、この関数は timeout_time より前のどこかの時点でミューテックスが他のいかなるスレッドにもロックされていなかったことがあっても、 spurious に失敗して false を返すことが認められています。
true を返した場合、同じミューテックスに対する以前の unlock() 操作は、この操作に対して同期します (std::memory_order を参照してください)。
その mutex をすでに所有しているスレッドによって try_lock_until が呼ばれた場合、動作は未定義です。
引数
| timeout_time | - | ブロックする最大時点 |
戻り値
ロックの取得に成功した場合は true、そうでなければ false。
例外
実行中に clock、time_point、または duration によって投げられるあらゆる例外 (標準ライブラリによって提供される clock、time_point、および duration は、例外を投げることはありません)。
例
この例は10秒のブロックを行います。
#include <thread>
#include <iostream>
#include <chrono>
#include <mutex>
std::timed_mutex test_mutex;
void f()
{
auto now=std::chrono::steady_clock::now();
test_mutex.try_lock_until(now + std::chrono::seconds(10));
std::cout << "hello world\n";
}
int main()
{
std::lock_guard<std::timed_mutex> l(test_mutex);
std::thread t(f);
t.join();
}
関連項目
| ミューテックスをロックします。 利用可能でない場合はブロックします (パブリックメンバ関数) | |
| ミューテックスのロックを試みます。 利用可能でない場合はリターンします (パブリックメンバ関数) | |
| ミューテックスのロックを試みます。 指定されたタイムアウト時間の間ミューテックスが利用可能にならなければリターンします (パブリックメンバ関数) | |
| ミューテックスのロックを解除します (パブリックメンバ関数) | |
mtx_timedlock の C言語リファレンス
| |