互斥对象锁和临界区锁性能对照
发布时间:2021-12-18 15:21:59 所属栏目:教程 来源:互联网
导读:在Win32平台上进行多线程编程,常会用到锁。下边用C++实现了互斥对象(Mutex)锁和临界区(CRITICAL_SECTION)锁,以加深理解和今后方便使用。代码已在VS2005环境下编译测试通过。 Lock.h #ifndef _Lock_H #define _Lock_H #include windows.h //锁接口类 cl
在Win32平台上进行多线程编程,常会用到锁。下边用C++实现了互斥对象(Mutex)锁和临界区(CRITICAL_SECTION)锁,以加深理解和今后方便使用。代码已在VS2005环境下编译测试通过。 Lock.h #ifndef _Lock_H #define _Lock_H #include <windows.h> //锁接口类 class ILock { public: virtual ~ILock() {} virtual void Lock() const = 0; virtual void Unlock() const = 0; }; //互斥对象锁类 class Mutex : public ILock { public: Mutex(); ~Mutex(); virtual void Lock() const; virtual void Unlock() const; private: HANDLE m_mutex; }; //临界区锁类 class CriSection : public ILock { public: CriSection(); ~CriSection(); virtual void Lock() const; virtual void Unlock() const; private: CRITICAL_SECTION m_critclSection; }; //锁 class CMyLock { public: CMyLock(const ILock&); ~CMyLock(); private: const ILock& m_lock; }; #endif Lock.cpp #include "Lock.h" //--------------------------------------------------------------------------- //创建一个匿名互斥对象 Mutex::Mutex() { m_mutex = ::CreateMutex(NULL, FALSE, NULL); } //销毁互斥对象,释放资源 Mutex::~Mutex() { ::CloseHandle(m_mutex); } //确保拥有互斥对象的线程对被保护资源的独自访问 void Mutex::Lock() const { DWORD d = WaitForSingleObject(m_mutex, INFINITE); } //释放当前线程拥有的互斥对象,以使其它线程可以拥有互斥对象,对被保护资源进行访问 void Mutex::Unlock() const { ::ReleaseMutex(m_mutex); } //--------------------------------------------------------------------------- //初始化临界资源对象 CriSection::CriSection() { ::InitializeCriticalSection(&m_critclSection); } //释放临界资源对象 CriSection::~CriSection() { ::DeleteCriticalSection(&m_critclSection); } //进入临界区,加锁 void CriSection::Lock() const { ::EnterCriticalSection((LPCRITICAL_SECTION)&m_critclSection); } //离开临界区,解锁 void CriSection::Unlock() const { ::LeaveCriticalSection((LPCRITICAL_SECTION)&m_critclSection); } //--------------------------------------------------------------------------- //利用C++特性,进行自动加锁 CMyLock::CMyLock(const ILock& m) : m_lock(m) { m_lock.Lock(); } //利用C++特性,进行自动解锁 CMyLock::~CMyLock() { m_lock.Unlock(); } ![]() (编辑:我爱故事小小网_铜陵站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |