美文网首页
C++11 Thread::Mutex class 线程互斥量

C++11 Thread::Mutex class 线程互斥量

作者: Aliven888 | 来源:发表于2020-08-31 10:41 被阅读0次

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。


资料仅供学习交流使用。
作者: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]

相关文章

网友评论

      本文标题:C++11 Thread::Mutex class 线程互斥量

      本文链接:https://www.haomeiwen.com/subject/mhelsktx.html