public member function
<mutex>

std::unique_lock::try_lock_for

template <class Rep, class Period>  bool try_lock_for (const chrono::duration<Rep,Period>& rel_time);
在时间段内尝试锁定互斥量
调用所管理定时互斥量对象的成员函数 try_lock_for,并使用其返回值来设置拥有状态

如果调用前拥有状态已经是true,或者对象当前管理着互斥量对象,该函数将抛出 system_error 异常。

参数

rel_time
线程等待获取锁的最长时间。
duration 是一个表示特定相对时间的对象。

返回值

如果函数成功锁定了所管理的定时互斥量对象,则返回true
否则返回 false

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// unique_lock::try_lock_for example
#include <iostream>       // std::cout
#include <chrono>         // std::chrono::milliseconds
#include <thread>         // std::thread
#include <mutex>          // std::timed_mutex, std::unique_lock, std::defer_lock

std::timed_mutex mtx;

void fireworks () {
  std::unique_lock<std::timed_mutex> lck(mtx,std::defer_lock);
  // waiting to get a lock: each thread prints "-" every 200ms:
  while (!lck.try_lock_for(std::chrono::milliseconds(200))) {
    std::cout << "-";
  }
  // got a lock! - wait for 1s, then this thread prints "*"
  std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  std::cout << "*\n";
}

int main ()
{
  std::thread threads[10];
  // spawn 10 threads:
  for (int i=0; i<10; ++i)
    threads[i] = std::thread(fireworks);

  for (auto& th : threads) th.join();

  return 0;
}

可能的输出(大约 10 秒后,行长度可能略有不同)

------------------------------------*
----------------------------------------*
-----------------------------------*
------------------------------*
-------------------------*
--------------------*
---------------*
----------*
-----*
*


数据竞争

访问/修改 unique_lock 对象。
所管理的定时互斥量对象被作为原子操作访问/修改(不会导致数据竞争)。

异常安全

基本保证:如果此成员函数抛出异常,则 unique_lock 对象仍处于有效状态。

如果调用失败,将抛出system_error 异常
exception typeerror condition描述
system_errorerrc::resource_deadlock_would_occurunique_lock 对象已拥有锁
system_errorerrc::operation_not_permittedunique_lock 对象当前未管理任何互斥量对象(因为它被默认构造移动释放)。
如果对所管理的定时互斥量对象try_lock_for 调用失败,或库实现通过此类机制报告的任何其他条件,也会抛出异常。

另见