C++11 引入的互斥锁类Mutexclass,你了解多少?快来看看

网安智编 厦门萤点网络科技 2025-08-08 00:03 82 0
文档声明, 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处, 请多多指正。并且该文档在后期会随着学习的深入不断补充完善。 资料仅供学习交流使用。 作者,** 1、简述 互斥锁类,,是C++11引入的新功能类。 互斥锁是一...

文档声明,

以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,

请多多指正。并且该文档在后期会随着学习的深入不断补充完善。

资料仅供学习交流使用。

作者,**

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()安全些。

如果互斥锁当前未被任何线程锁定,则调用线程将会将其锁定,从这一刻起,直到调用()将其解锁,其他线程才能拥有该互斥锁,。

互斥锁类Mutex详解_c c++ mutex_C++11互斥锁学习笔记

如果互斥锁当前已被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();

输出结果,----------------------------------------