std::timed_mutex::try_lock_for
来自cppreference.com
< cpp | thread | timed mutex
template<class Rep, class Period > bool try_lock_for(conststd::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 中的某个时间点此互斥体没有被任何其他线程锁定。
如果此操作返回 true,那么相同互斥体上先前的 unlock() 操作同步于(在 std::memory_order 定义)它。
如果由已占有此互斥体的线程调用 try_lock_for
,那么行为未定义。
目录 |
[编辑]参数
timeout_duration | - | 要阻塞的最大时长 |
[编辑]返回值
成功锁定时返回 true,否则返回 false。
[编辑]异常
timeout_duration 可能抛出的任何异常(标准库提供的时长决不抛出)。
[编辑]示例
运行此代码
#include <chrono>#include <iostream>#include <mutex>#include <sstream>#include <thread>#include <vector> usingnamespace 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 <<"成功 ";std::this_thread::sleep_for(100ms); mutex.unlock();}else stream <<"失败 "; 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& i: threads) i.join();}
可能的输出:
[0] 失败 失败 失败 [3] 失败 失败 成功 [2] 失败 成功 失败 [1] 成功 失败 成功
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2093 | C++11 | try_lock_for 不会抛出 | 抛出超时相关异常 |
[编辑]参阅
锁定互斥体,若互斥体不可用则阻塞 (公开成员函数) | |
尝试锁定互斥体,若互斥体不可用则返回 (公开成员函数) | |
尝试锁定互斥体,若直至抵达指定时间点互斥体不可用则返回 (公开成员函数) | |
解锁互斥体 (公开成员函数) |