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的对象。

浙公网安备 33010602011771号