自定义的互斥量类,可以用于线程或进程的同步
2011-03-10 07:58
197 查看
#ifndef __MUTEX_H
#define __MUTEX_H
#include
class CMutex
{
public:
CMutex(LPCTSTR pszMutex)
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
m_hMutex = NULL;
m_hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, pszMutex);
if (NULL == m_hMutex)
{
m_hMutex = ::CreateMutex(NULL, FALSE, pszMutex);
}
}
~CMutex()
{
Unlock();
::CloseHandle(m_hMutex);
m_hMutex = NULL;
}
public:
VOID Lock()
{
DWORD dwResult;
do
{
dwResult = ::WaitForSingleObject(m_hMutex, INFINITE);
}while(dwResult != WAIT_OBJECT_0);
}
VOID Unlock()
{
if (NULL != m_hMutex)
{
DEBUG_MSG(TEXT("FreeMutex ..."));
::ReleaseMutex(m_hMutex);
}
}
private:
static void DEBUG_MSG(LPCTSTR szFormat, ... )
{
#ifdef _DEBUG
SYSTEMTIME stST;
::GetLocalTime(&stST);
FILE *fFile = NULL;
TCHAR szTmp[1024] = {0};
char szMsg[1024] = {0}, szTemp[1024] = {0};
va_list valueList;
va_start(valueList, szFormat);
int nWrite = _vsntprintf((LPTSTR)szTmp, BUFSIZ, szFormat, valueList);
va_end( valueList );
if( (fFile = fopen("c://DebugInfo.log", "a+" )) == NULL )
return;
::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)szTmp, -1, szMsg, 1024, NULL, NULL );
fseek(fFile,0,SEEK_END);
//fwrite(szMsg,strlen(szMsg),1,fFile);
sprintf(szTemp, "%-80s%02d:%02d:%02d.%03d", szMsg,
stST.wHour,
stST.wMinute,
stST.wSecond,
stST.wMilliseconds);
fwrite(szTemp,strlen(szTemp), 1, fFile);
fwrite("/n",1,1,fFile);
fclose(fFile);
#endif
}
private:
static HANDLE m_hMutex;
};
HANDLE CMutex::m_hMutex = NULL;
#endif
#define __MUTEX_H
#include
class CMutex
{
public:
CMutex(LPCTSTR pszMutex)
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
m_hMutex = NULL;
m_hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, pszMutex);
if (NULL == m_hMutex)
{
m_hMutex = ::CreateMutex(NULL, FALSE, pszMutex);
}
}
~CMutex()
{
Unlock();
::CloseHandle(m_hMutex);
m_hMutex = NULL;
}
public:
VOID Lock()
{
DWORD dwResult;
do
{
dwResult = ::WaitForSingleObject(m_hMutex, INFINITE);
}while(dwResult != WAIT_OBJECT_0);
}
VOID Unlock()
{
if (NULL != m_hMutex)
{
DEBUG_MSG(TEXT("FreeMutex ..."));
::ReleaseMutex(m_hMutex);
}
}
private:
static void DEBUG_MSG(LPCTSTR szFormat, ... )
{
#ifdef _DEBUG
SYSTEMTIME stST;
::GetLocalTime(&stST);
FILE *fFile = NULL;
TCHAR szTmp[1024] = {0};
char szMsg[1024] = {0}, szTemp[1024] = {0};
va_list valueList;
va_start(valueList, szFormat);
int nWrite = _vsntprintf((LPTSTR)szTmp, BUFSIZ, szFormat, valueList);
va_end( valueList );
if( (fFile = fopen("c://DebugInfo.log", "a+" )) == NULL )
return;
::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)szTmp, -1, szMsg, 1024, NULL, NULL );
fseek(fFile,0,SEEK_END);
//fwrite(szMsg,strlen(szMsg),1,fFile);
sprintf(szTemp, "%-80s%02d:%02d:%02d.%03d", szMsg,
stST.wHour,
stST.wMinute,
stST.wSecond,
stST.wMilliseconds);
fwrite(szTemp,strlen(szTemp), 1, fFile);
fwrite("/n",1,1,fFile);
fclose(fFile);
#endif
}
private:
static HANDLE m_hMutex;
};
HANDLE CMutex::m_hMutex = NULL;
#endif
相关文章推荐
- ReaderWriterLock(定义支持单个写线程和多个读线程的锁),Mutex(一个同步基元,也可用于进程间同步。 )
- ReaderWriterLock(定义支持单个写线程和多个读线程的锁),Mutex(一个同步基元,也可用于进程间同步。 )
- 线程与进程的同步问题
- 操作系统之进程互斥与同步和线程
- cpu-hogs 的 systemtap 工具,可以实时统计某段时间内实际消耗掉的 CPU 时间在所有用户进程及内核线程之间的比例分布。
- 突破python缺陷,实现几种自定义线程池 以及进程、线程、协程的介绍
- 我对进程、线程、异步、同步的理解
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 进程的同步与通信,进程与线程同步的区别,进程与线程通信的区别
- java基础问题---java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用
- iOS 多线程 进程、线程、并发、串行、同步、异步—— iOS 编码复习(四)(多线程2)
- java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- 进程,线程通信与同步
- 同一进程下的线程可以共享的内容
- 同一进程下的线程可以共享以下?
- 同一进程中的线程有哪些资源可以共享(转)
- 突破python缺陷,实现几种自定义线程池 以及进程、线程、协程的介绍
- Python 中的进程、线程、协程、同步、异步、回调
- C#及.NET2.0学习笔记之进程、线程与同步