std::mutex::lock和std::recursive_mutex,std::lock

原型

  void lock();

 

锁住互斥量

调用的线程会锁住互斥量(mutex),必要的话会被阻塞:

  • 如果其它任何线程没有对互斥量进行锁操作,调用线程会对互斥量进行锁操作(从这一时刻开始,直到调用unlock,互斥量为调用线程拥有)
  • 如果其它线程又锁住互斥量,再次执行lock的线程会被阻塞,直到拥有互斥量的线程调用unlock(其它未对互斥量进行操作的线程继续执行各自任务)
  • 如果互斥量已经被调用lock的线程锁住,它会导致死锁(出现未定义表现)。查看recursive_mutex,了解互斥量类型,部分互斥量允许在同一个线程里进行多次锁操作。

 

一个互斥量的所有lock和unlock操作,遵循一个总的顺序,如此在同一个对象进行lock操作和上一次unlock操作之间实现同步。

 

非成员函数lock允许同时锁住多个互斥量(mutex),以避免潜在的死锁(当多个线程以不同的顺序lock/unlock各自的互斥量)。

 

注意:预定返回的不同的并发锁的顺序是不定的,不一定和它们lock的顺序有关(取决于系统和库的实现)。

 

recursive_mutex

和互斥量(mutex)一样,一个递归互斥量(recursive mutex)是一个可锁的对象,只是它允许同一个线程对互斥量对象获取多级所有权。

如此,它允许已进行了锁操作的线程,再次lock(或try-lock)互斥量对象,获取该互斥量对象一个新所有权:互斥量对象一直为拥有线程锁住,在调用unlock的次数和lock次数相同前。

这是一个标准的布局类。

 

 

std::lock

锁多个互斥量

锁住所有被当做参数传过来的对象,必要的话会阻塞调用线程。

函数对对象进行锁操作,以一种未指定的顺序调用对象的lock,try_lock和unlock来保证返回时所有参数都被锁住(不会产生死锁)。

如果函数无法锁住所有对象(例如其中的摸个抛出异常),失败前,函数首先会unlocks所有它在之前已成功lock的对象。

posted @ 2020-07-13 18:04  N_zero  阅读(691)  评论(0)    收藏  举报