函数模板
<mutex>

std::lock

template <class Mutex1, class Mutex2, class... Mutexes>  void lock (Mutex1& a, Mutex2& b, Mutexes&... cde);
锁住多个互斥量
锁定所有传入的互斥量对象,如果需要会阻塞当前线程。

该函数使用一系列未指定的互斥量成员 locktry_lockunlock 的调用来锁定对象,确保在返回时所有对象都被锁定(且不会发生死锁)。

如果该函数无法锁定所有对象(例如,因为其内部调用抛出了异常),则该函数会先解锁所有它成功锁定的对象(如果有的话),然后才失败。

参数

a, b, cde
要锁定的对象。
Mutex1Mutex2Mutexes 必须是可锁定类型

返回值



示例

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
// std::lock example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::lock

std::mutex foo,bar;

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

void task_b () {
  // bar.lock(); foo.lock(); // replaced by:
  std::lock (bar,foo);
  std::cout << "task b\n";
  bar.unlock();
  foo.unlock();
}

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

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

  return 0;
}
请注意,在用 std::lock 调用替换单独的锁之前,如果 task_a 锁定了 footask_b 锁定了 bar,那么两者都无法获得第二个锁,从而导致死锁。

可能的输出(行顺序可能不同)

task a
task b


数据竞争

参数被修改。

异常安全

提供与对参数执行的操作相同的保证级别。

另见