C++11 Thread::Mutex class 线程互斥量学习笔记

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


资料仅供学习交流使用。
作者:Aliven888

1、简述

互斥锁类 (Mutex class)是C++11引入的新功能类。

互斥锁是一个可锁定的对象,旨在在关键的代码段需要独占访问时发出信号,从而防止具有相同保护的其他线程同时执行并访问相同的内存位置。

互斥对象提供独占所有权,并且不支持递归性(即线程不得锁定它已经拥有的互斥体)。

2、接口函数

名称描述
lockLock mutex (public member function)
try_lockLock mutex if not locked (public member function)
unlockUnlock mutex (public member function)
native_handleGet 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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值