Namespaces
Variants

std::shared_timed_mutex:: try_lock_for

From cppreference.net

Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
template < class Rep, class Period >
bool try_lock_for ( const std:: chrono :: duration < Rep, Period > & timeout_duration ) ;
(C++14以降)

ミューテックスのロックを試みます。指定された期間 timeout_duration が経過する(タイムアウト)か、ロックが取得される(ミュー�テックスを所有する)かのいずれか早い方までブロックします。ロックの取得に成功した場合は true を返し、それ以外の場合は false を返します。

timeout_duration timeout_duration. zero ( ) 以下である場合、この関数は try_lock() と同様に動作します。

この関数は、スケジューリングやリソース競合による遅延のため、 timeout_duration よりも長くブロックする可能性があります。

標準では、時間の計測には std::steady_clock の使用が推奨されています。実装が代わりに std::system_clock を使用する場合、待機時間はクロック調整の影響を受ける可能性もあります。

try_lock() と同様に、この関数は偽の失敗を許容し、 false を返すことがあります。これは、 timeout_duration 中のいずれかの時点でミューテックスが他のスレッドによってロックされていなかった場合でも発生する可能性があります。

同じミューテックスに対する前回の unlock() 操作は、この操作が true を返す場合、 synchronizes-with std::memory_order で定義される)関係を形成します。

try_lock_for が共有モードまたは排他モードのいずれかで既にミューテックスを所有しているスレッドによって呼び出された場合、動作は未定義です。

目次

パラメータ

timeout_duration - ブロックする最小期間

戻り値

true ロックの取得に成功した場合、それ以外の場合は false

例外

timeout_duration によってスローされる例外(標準ライブラリが提供する期間は例外をスローしません)。

#include <chrono>
#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>
#include <vector>
using namespace std::chrono_literals;
std::mutex cout_mutex; // std::coutへのアクセスを制御
std::timed_mutex mutex;
void job(int id)
{
    std::ostringstream stream;
    for (int i = 0; i < 3; ++i)
    {
        if (mutex.try_lock_for(100ms))
        {
            stream << "success ";
            std::this_thread::sleep_for(100ms);
            mutex.unlock();
        }
        else
            stream << "failed ";
        std::this_thread::sleep_for(100ms);
    }
    std::lock_guard<std::mutex> lock{cout_mutex};
    std::cout << '[' << id << "] " << stream.str() << '\n';
}
int main()
{
    std::vector<std::thread> threads;
    for (int i{0}; i < 4; ++i)
        threads.emplace_back(job, i);
    for (auto& th : threads)
        th.join();
}

出力例:

[0] failed failed failed 
[3] failed failed success 
[2] failed success failed 
[1] success failed success

関連項目

ミューテックスをロックする。利用できない場合はブロックする
(public member function)
ミューテックスのロックを試みる。利用できない場合は即座に返る
(public member function)
ミューテックスのロックを試みる。指定された時間ポイントに達するまで
利用できない場合は返る
(public member function)
ミューテックスをアンロックする
(public member function)