public member function
<mutex>

std::unique_lock::try_lock

bool try_lock();
如果未锁定,则锁定互斥量
调用被管理互斥量对象的成员函数 try_lock,并使用其返回值设置拥有状态

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

参数



返回值

如果该函数成功锁定了被管理的互斥量对象,则返回 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
// unique_lock::try_lock example
#include <iostream>       // std::cout
#include <vector>         // std::vector
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::unique_lock, std::defer_lock

std::mutex mtx;           // mutex for critical section

void print_star () {
  std::unique_lock<std::mutex> lck(mtx,std::defer_lock);
  // print '*' if successfully locked, 'x' otherwise: 
  if (lck.try_lock())
    std::cout << '*';
  else                    
    std::cout << 'x';
}

int main ()
{
  std::vector<std::thread> threads;
  for (int i=0; i<500; ++i)
    threads.emplace_back(print_star);

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

  return 0;
}

可能的输出('x' 的数量 -如果有的话- 可能不同)

*****************************x******************************x*x***x***x*x*x**x**
x**********x********************************************************************
************x*x*x*x*************************************************************
*******x********x**********x****************************************************
***************************************x*x*x*x**x*x*x*x*x*x*********************
**x*****************************************************************************
***************x****


数据竞争

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

异常安全

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

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

另见