加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱故事小小网_铜陵站长网 (http://www.0562zz.com/)- 视频终端、云渲染、应用安全、数据安全、安全管理!
当前位置: 首页 > 教程 > 正文

互斥对象锁和临界区锁性能对照

发布时间: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();  
}  

(编辑:我爱故事小小网_铜陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读