易网时代-编程资源站
Welcome
微信登录
首页
/
操作系统
/
Linux
/
互斥对象锁和临界区锁性能比较
在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();
}
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图