public member function
<mutex>

std::timed_mutex::try_lock_for

template <class Rep, class Period>  bool try_lock_for (const chrono::duration<Rep,Period>& rel_time);
尝试锁定一段时间
尝试锁定timed_mutex,最多阻塞rel_time的时间
  • 如果timed_mutex当前未被任何线程锁定,则调用线程锁定它(从此时开始,直到调用其成员unlock,该线程拥有timed_mutex)。
  • 如果timed_mutex当前被另一个线程锁定,则调用线程的执行将被阻塞,直到解锁rel_time已过,以先发生者为准(在此期间,其他未锁定的线程将继续执行)。
  • 如果timed_mutex当前被调用此函数的同一线程锁定,则会导致死锁(具有未定义行为)。有关允许同一线程多次锁定的定时互斥量类型,请参阅recursive_timed_mutex

timed_mutex的所有锁定解锁操作都遵循单一的全局顺序,所有可见效果锁定操作和同一对象上的先前解锁操作之间同步。

参数

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

返回值

如果函数成功为线程锁定timed_mutex,则返回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
// timed_mutex::try_lock_for example
#include <iostream>       // std::cout
#include <chrono>         // std::chrono::milliseconds
#include <thread>         // std::thread
#include <mutex>          // std::timed_mutex

std::timed_mutex mtx;

void fireworks () {
  // waiting to get a lock: each thread prints "-" every 200ms:
  while (!mtx.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";
  mtx.unlock();
}

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 秒后,行长度可能略有不同)

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


数据竞争

timed_mutex 对象被作为原子操作访问/修改(不会导致数据竞争)。

异常安全

如果timed_mutex当前被调用线程锁定,则会导致未定义行为
否则,它提供与duration 对象上的操作相同的保证(对于<chrono> 中的类型实例化,这是无抛出保证)。

另见