一种跨平台的快速锁

    

    C++11发布了四种不同的用于跨平台的锁,但其为了夸平台做了很多工作,在需要性能要求的情况下,大量的调用枷锁解锁必定会导致效率问题(现在计算机都这么快了这点运算其实又算得了什么呢,以后就不拿性能当幌子了闭嘴),实际上在C++11发布之前就写好了一个夸平台的锁(大部分平台都可以用),代码比较简洁可以直接拿来用,自己平时用的比较多,真正原因就是自己不舍得这些代码用C++11的代替了。


    这里要介绍的锁在同线程下支持递归枷锁,windows下使用临界区,不涉及内核对象,其他平台使用pthread库中的pthread_mutex_t对象,含有PTHREAD_MUTEX_RECURSIVE属性实现归枷锁,代码分了两个文件来实现,分别粘贴在下面,其中#include "PLTConfig.h"文件中定义了一些系统宏,参考QT定义的系统宏。


这是.h文件


/* 
============================================================================================
	Locker 快速锁对象
	同线程内可以递归加锁
	加锁和解锁必须在同一线程内
	这种锁是进程内私有 不能和其他进程公用
	windows下使用临界区 pthread下使用PTHREAD_MUTEX_RECURSIVE属性的互斥量

	add 2013.11.22 by yuwf

	Copyright (c), ...	

=============================================================================================
*/

#ifndef _PALANTIR_LOCKER_H
#define _PALANTIR_LOCKER_H

#include "PLTConfig.h"	// 根据系统定义 PLT_OS_WIN 和 PTHREAD 宏

#if defined(PLT_OS_WIN)
#include <windows.h>
#elif defined(PTHREAD)
#include <pthread.h>
#endif

namespace Palantir
{
	// 允许加锁线程递归加锁
	class Locker
	{
	public:
		Locker();
		~Locker();

		// 加锁 不是同一线程枷锁会阻塞
		void Lock();

		// 非阻塞 枷锁成功返回true 否则返回false
		bool TryLock();

		// 解锁
		void Unlock();

	protected:
#if defined(PLT_OS_WIN)
		CRITICAL_SECTION	m_critical_section;	// 临界区
#elif defined(PTHREAD)
		pthread_mutex_t 	m_mutex;			// 互斥锁
#endif

	private:
		// 禁止拷贝和赋值构造
		Locker( const Locker& ) {};
		Locker& operator = ( const Locker& ) { return *this; };
	};

	// 空锁 辅助使用
	class EmptyLocker
	{
	public:
		// 加锁
		void Lock() {};

		bool TryLock() { return true; };

		// 解锁
		void Unlock() {};
	};
	
	// 加锁辅助工具
	template<class _LockerType_>
	class LockerGuard
	{
	public:
		LockerGuard( _LockerType_& locker ) 
			: m_locker(locker)
		{
			locker.Lock();
		}
		~LockerGuard()
		{
			m_locker.Unlock();
		}
	protected:
		_LockerType_& m_locker;
	};

	typedef LockerGuard<Locker> AutoLocker;
	
}

#endif



这是.cpp文件

/* 
============================================================================================
	Locker 快速锁对象 实现文件

	add 2013.11.22 by yuwf

	Copyright (c), ...	

=============================================================================================
*/


#include "PLTLocker.h"

namespace Palantir
{
	Locker::Locker()
	{
#if defined(PLT_OS_WIN)
		InitializeCriticalSection( &m_critical_section );
#elif defined(PTHREAD)
		pthread_mutexattr_t attr;
		pthread_mutexattr_init( &attr );
		pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE );	// 这个互斥锁可递归加锁 因为windows下的临界区可以递归加锁
		pthread_mutex_init( &m_mutex, &attr );
#endif
	}

	Locker::~Locker()
	{
#if defined(PLT_OS_WIN)
		DeleteCriticalSection( &m_critical_section );
#elif defined(PTHREAD)
		pthread_mutex_destroy( &m_mutex );
#endif
	}

	void Locker::Lock()
	{
#if defined(PLT_OS_WIN)
		EnterCriticalSection( &m_critical_section );
#elif defined(PTHREAD)
		pthread_mutex_lock( &m_mutex );
#endif
	}

	bool Locker::TryLock()
	{
#if defined(PLT_OS_WIN)
		if ( !TryEnterCriticalSection( &m_critical_section ) )
		{
			return false;
		}
#elif defined(PTHREAD)
		if( pthread_mutex_trylock( &m_mutex ) != 0 )
		{
			return false;
		}
#endif
		return true;
	}

	void Locker::Unlock()
	{
#if defined(PLT_OS_WIN)
		LeaveCriticalSection( &m_critical_section );
#elif defined(PTHREAD)
		pthread_mutex_unlock( &m_mutex );
#endif
	}
}



代码中定义了一个空锁EmptyLocker,主要用来辅助使用,比如在后面要介绍的内存池中可以传入一个空锁来实现一个不需要枷锁的内存池,LockerGuard也是用来辅助使用,功能很简单,不做赘述。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小程序是一种轻量级的应用程序,可以在微信等平台上运行,具有快速、便捷和跨平台的特点。因此,我们选择开发小程序项目源码,以满足开发人员的需求。 首先,我们的小程序项目源码提供了丰富的功能和模块,可以满足各种类型的小程序应用需求。无论是电商、社交、教育还是娱乐,我们的项目源码都提供了相应的功能和界面设计,使得开发人员可以快速构建符合需求的小程序应用。 其次,我们的小程序项目源码具有良好的可扩展性和可定制性。我们将项目源码设计为模块化的结构,开发人员可以根据自己的需求选择和定制所需的功能模块。同时,我们还提供了丰富的文档和示例代码,以帮助开发人员理解和使用项目源码。 我们的小程序项目源码还采用了一些常用的技术和工具,以提高开发效率和代码质量。例如,我们使用了微信小程序开发框架,它提供了一系列的API和组件,使得开发人员可以快速构建小程序应用。我们还使用了Vue.js作为前端开发框架,它提供了一种简洁而灵活的方式来构建交互式界面。 此外,我们的小程序项目源码还注重用户体验和界面设计。我们提供了一系列的界面模板和样式库,使得开发人员可以轻松创建漂亮而用户友好的小程序界面。我们还提供了一些常用的交互组件和动画效果,以增加小程序的交互性和吸引力。 总之,我们的小程序项目源码旨在帮助开发人员快速构建各种类型的小程序应用。无论是电商、社交、教育还是娱乐,我们相信我们的项目源码将能够提供强大的支持和帮助。感谢您对我们项目的关注和支持!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值