函式模板
<mutex>

std::try_lock

template <class Mutex1, class Mutex2, class... Mutexes>  int try_lock (Mutex1& a, Mutex2& b, Mutexes&... cde);
嘗試鎖定多個互斥量
使用其 try_lock 成員函式(非阻塞)嘗試鎖定作為引數傳遞的所有物件。

該函式依次呼叫每個引數(先是 a,然後是 b,最後是 cde 中的其他引數)的 try_lock 成員函式,直到所有呼叫都成功,或者其中一個呼叫失敗(返回 false 或丟擲異常)。

如果函式因為某個呼叫失敗而結束,則會對所有成功呼叫 try_lock 的物件呼叫 unlock,並返回鎖定失敗的物件的引數順序號。不會對引數列表中的其餘物件執行進一步的呼叫。

引數

a, b, cde
要嘗試鎖定的物件。
Mutex1Mutex2Mutexes 必須是 可鎖定型別

返回值

如果函式成功鎖定所有物件,則返回 -1
否則,函式返回未能鎖定的物件的索引(a0b1,依此類推)。

示例

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
31
32
33
34
35
36
37
38
39
// std::lock example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::try_lock

std::mutex foo,bar;

void task_a () {
  foo.lock();
  std::cout << "task a\n";
  bar.lock();
  // ...
  foo.unlock();
  bar.unlock();
}

void task_b () {
  int x = try_lock(bar,foo);
  if (x==-1) {
    std::cout << "task b\n";
    // ...
    bar.unlock();
    foo.unlock();
  }
  else {
    std::cout << "[task b failed: mutex " << (x?"foo":"bar") << " locked]\n";
  }
}

int main ()
{
  std::thread th1 (task_a);
  std::thread th2 (task_b);

  th1.join();
  th2.join();

  return 0;
}

可能的輸出

task a
[task b failed: mutex foo locked]

互斥量可能被 task_b 鎖定,或者兩個任務都可能以任何順序成功鎖定(失敗時文字可能會交錯出現)。

資料競爭

引數會被修改。

異常安全

提供與對引數執行的操作相同的保證級別。

另見