文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。
资料仅供学习交流使用。
作者:Aliven888
1、简述
互斥锁类 (Mutex class)是C++11引入的新功能类。
互斥锁是一个可锁定的对象,旨在在关键的代码段需要独占访问时发出信号,从而防止具有相同保护的其他线程同时执行并访问相同的内存位置。
互斥对象提供独占所有权,并且不支持递归性(即线程不得锁定它已经拥有的互斥体)。
2、接口函数
名称 | 描述 |
---|---|
lock | Lock mutex (public member function) |
try_lock | Lock mutex if not locked (public member function) |
unlock | Unlock mutex (public member function) |
native_handle | Get native handle (public member function) |
3、接口详解
3.1、互斥类【mutex class】
可以使用互斥类定义一个互斥对象(互斥锁),可以用于锁定目标对象,在关键代码段需要独占访问时发出信号,从而防止具有相同保护的其他线程同时执行并访问相同的内存位置,而导致该内存该读写异常。
注意事项:互斥对象提供独占所有权,并不支持递归性(即线程不得锁定他已拥有的互斥体)
3.2、锁定互斥锁【mutex::lock()】
如果该互斥锁当前未被任何线程锁定,则调用线程,可以通过lock()函数将其锁定,从被锁定的这一刻开始,直到调用unlock()函数(下面将会接介绍)解锁,该互斥锁才能被其他线程使用。
如果互斥锁当前已被A线程锁定,而B线程要想使用互斥锁,则就必须等A线程解锁后才行。
互斥锁上的所有锁定与解锁操作必须遵循总数相等原则,即每次锁定在使用之后,都需要做解锁操作。
非成员函数锁允许同时锁定多个互斥对象,从而避免了当多个线程以不同的顺序锁定/解锁单个互斥对象时可能发生死锁。
3.3、锁定互斥锁【Mutex::try_lock()】
如果互斥锁处于未被锁定状态,则锁定互斥锁。
尝试锁定互斥锁不会造成线程阻塞,所以try_lock() 要比 lock()安全些。
如果互斥锁当前未被任何线程锁定,则调用线程将会将其锁定(从这一刻起,直到调用unlock()将其解锁,其他线程才能拥有该互斥锁)。
如果互斥锁当前已被A线程锁定,那么B线程在调用try_lock()时,将返回false,而不会造成线程阻塞,A线程可以继续执行;如果互斥锁当前已被A线程锁定,那么A线程再次调用try_lock()函数锁定时,将会产生死锁(具有未定义行为)。
缺点:当互斥锁没有被其他线程所定时,try_lock()可能会虚假的返回失败,但是在这种情况下重复调用将在某个时候成功。
返回值:如果函数成功锁定了互斥锁,则返回true, 否则返回false 。
3.4、解锁互斥锁【Mutex::unlock()】
解锁互斥锁,释放对它的所有权。
如果当前阻止其他线程尝试锁定该互斥锁,则其中一个将获取该线程的所有权并继续执行。
互斥锁上的所有锁定与解锁操作必须遵循总数相等原则,即每次锁定在使用之后,都需要做解锁操作。
如果互斥锁当前未被调用线程锁定,则它将导致未定义的行为
3.5、获取本地句柄【Mutex::native_handle()】
如果库实现支持,则该成员函数仅在互斥量类中存在;如果存在,他将返回一个值,该值用于访问与对象关联的特定于实现的信息。
返回值:成员类型为 Mutex::native_handle_type 的值
4、代码演示
void threadFun1(int iCount)
{
mutexShow.lock();
for(int i = 0; i < iCount; ++i)
{
qDebug("threadFun1 print -- [%d]", i);
}
Sleep(50);
mutexShow.unlock();
}
void threadFun2(int iCount)
{
mutexShow.lock();
for (int i = 0; i < iCount; ++i)
{
qDebug("threadFun2 print -- [%d]", i);
}
Sleep(50);
mutexShow.unlock();
}
void main()
{
std::thread th1(threadFun1, 10);
std::thread th2(threadFun2, 10);
th1.join();
th2.join();
}
输出结果:
threadFun1 print -- [0]
threadFun1 print -- [1]
threadFun1 print -- [2]
threadFun1 print -- [3]
threadFun1 print -- [4]
threadFun1 print -- [5]
threadFun1 print -- [6]
threadFun1 print -- [7]
threadFun1 print -- [8]
threadFun1 print -- [9]
threadFun2 print -- [0]
threadFun2 print -- [1]
threadFun2 print -- [2]
threadFun2 print -- [3]
threadFun2 print -- [4]
threadFun2 print -- [5]
threadFun2 print -- [6]
threadFun2 print -- [7]
threadFun2 print -- [8]
threadFun2 print -- [9]
网友评论