C++11 引入的互斥锁类Mutexclass,你了解多少?快来看看
文档声明,
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,
请多多指正。并且该文档在后期会随着学习的深入不断补充完善。
资料仅供学习交流使用。
作者,**
1、简述
互斥锁类,,是C++11引入的新功能类。
互斥锁是一个可锁定的对象,旨在在关键的代码段需要独占访问时发出信号,从而防止具有相同保护的其他线程同时执行并访问相同的内存位置。
互斥对象提供独占所有权,并且不支持递归性,即线程不得锁定它已经拥有的互斥体,。
2、接口函数
名称描述()()()()
3、接口详解
3.1、互斥类【】
可以使用互斥类定义一个互斥对象,互斥锁,,可以用于锁定目标对象,在关键代码段需要独占访问时发出信号,从而防止具有相同保护的其他线程同时执行并访问相同的内存位置,而导致该内存该读写异常。
注意事项,互斥对象提供独占所有权,并不支持递归性,即线程不得锁定他已拥有的互斥体,
3.2、锁定互斥锁【mutex::lock()】
如果该互斥锁当前未被任何线程锁定,则调用线程,可以通过lock()函数将其锁定,从被锁定的这一刻开始,直到调用()函数,下面将会接介绍,解锁,该互斥锁才能被其他线程使用。
如果互斥锁当前已被A线程锁定,而B线程要想使用互斥锁,则就必须等A线程解锁后才行。
互斥锁上的所有锁定与解锁操作必须遵循总数相等原则,即每次锁定在使用之后,都需要做解锁操作。
非成员函数锁允许同时锁定多个互斥对象,从而避免了当多个线程以不同的顺序锁定/解锁单个互斥对象时可能发生死锁。
3.3、锁定互斥锁【Mutex::try_l
_lock()】
如果互斥锁处于未被锁定状态,则锁定互斥锁。
尝试锁定互斥锁不会造成线程阻塞,所以try_l
lock()要比lock()安全些。
如果互斥锁当前未被任何线程锁定,则调用线程将会将其锁定,从这一刻起,直到调用()将其解锁,其他线程才能拥有该互斥锁,。

如果互斥锁当前已被A线程锁定,那么B线程在调用()时,将返回false,而不会造成线程阻塞,A线程可以继续执行,如果互斥锁当前已被A线程锁定,那么A线程再次调用()函数锁定时,将会产生死锁,具有未定义行为,。
缺点,当互斥锁没有被其他线程所定时,try_l况下重复调用将在某个时候成功。
_lock()可能会虚假的返回失败,但是在这种情
返回值,如果函数成功锁定了互斥锁,则返回true,否则返回false。
3.4、解锁互斥锁【Mutex::()】
解锁互斥锁,释放对它的所有权。如果当前阻止其他线程尝试锁定该互斥锁,则其中一个将获取该线程的所有权并继续执行。
互斥锁上的所有锁定与解锁操作必须遵循总数相等原则,即每次锁定在使用之后,都需要做解锁操作。
如果互斥锁当前未被调用线程锁定,则它将导致未定义的行为
3.5、获取本地句柄【Mutex::
()】
如果库实现支持,则该成员函数仅在互斥量类中存在,如果存在,他将返回一个值,该值用于访问与对象关联的特定于实现的信息。
返回值,成员类型为Mutex::的值
4、代码演示
()
{.lock();for(inti=0;i
{("--",}
Sleep(50);.();
",i);
()
{.lock();for(inti=0;i
Sleep(50);.();
",i);
()
std::(,10);std::(,10);
th1.join();th2.join();
输出结果,----------------------------------------
























