std::recursive_timed_mutex::try_lock_for
來自 cppreference.com
< cpp | thread | recursive timed mutex
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) | |
嘗試鎖定互斥體,如果互斥體不可用則返回 (public member function) | |
嘗試鎖定互斥鎖,如果互斥鎖在指定超時時間內不可用,則返回 在指定時間點之前不可用 (public member function) | |
解鎖互斥體 (public member function) |