名稱空間
變體
操作

std::recursive_timed_mutex::try_lock_for

來自 cppreference.com
 
 
併發支援庫
執行緒
(C++11)
(C++20)
this_thread 名稱空間
(C++11)
(C++11)
(C++11)
協同取消
互斥
(C++11)
通用鎖管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
條件變數
(C++11)
訊號量
門閂和屏障
(C++20)
(C++20)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危險指標
原子型別
(C++11)
(C++20)
原子型別的初始化
(C++11)(C++20 中已棄用)
(C++11)(C++20 中已棄用)
記憶體排序
(C++11)(C++26 中已棄用)
原子操作的自由函式
原子標誌的自由函式
 
 
template< class Rep, class Period >
bool try_lock_for( const std::chrono::duration<Rep, Period>& timeout_duration );
(C++11 起)

嘗試鎖定互斥體。阻塞直到指定持續時間 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() 操作與此操作同步(如 std::memory_order 中定義),如果此操作返回 true

一個執行緒可以重複呼叫遞迴互斥體上的 try_lock_for。成功呼叫 try_lock_for 會增加所有權計數:互斥體只有在執行緒進行了匹配次數的 unlock() 呼叫後才會被釋放。

所有權的最大層數未指定。如果超出此數目,呼叫 try_lock_for 將返回 false

目錄

[編輯] 引數

timeout_duration - 最少阻塞持續時間

[edit] 返回值

如果成功獲取鎖,則為 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; // control access to 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

缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 2093 C++11 try_lock_for 未丟擲任何異常 丟擲與超時相關的異常

[編輯] 參閱

鎖定互斥體,如果互斥體不可用則阻塞
(public member function) [edit]
嘗試鎖定互斥體,如果互斥體不可用則返回
(public member function) [edit]
嘗試鎖定互斥鎖,如果互斥鎖在指定超時時間內不可用,則返回
在指定時間點之前不可用
(public member function) [edit]
解鎖互斥體
(public member function) [edit]