自定义的互斥量类,可以用于线程或进程的同步
来源:互联网 发布:多元非线性拟合算法 编辑:程序博客网 时间:2024/05/17 23:38
#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
- 自定义的互斥量类,可以用于线程或进程的同步
- 互斥锁可以用于不同进程的线程同步吗?
- 线程或进程同步的4种方法
- 四种线程或进程同步控制的方法
- 进程或线程同步互斥的控制方法
- 几个用于线程同步的锁
- 几个用于线程同步对象的区别
- Semaphore (通常用于限制可以访问某些资源(物理或逻辑的)的线程数目)
- 四种进程或线程同步互斥的控制方法
- C#中四种进程或线程同步互斥的控制方法
- 四种进程或线程同步互斥的控制方法
- 四种进程或线程同步互斥的控制方法
- C#中四种进程或线程同步互斥的控制方法
- 四种进程或线程同步互斥的控制方法
- C#中四种进程或线程同步互斥的控制方法
- C#中四种进程或线程同步互斥的控制方法
- VC++中四种进程或线程同步互斥的控制方法
- 四种进程或线程同步互斥的控制方法
- 无法从web服务器获取项目文件(转)
- C#的Enum—枚举
- silverlight API的网络分析出现错误(invalid context)的解决办法
- C++高效程序设计
- android 源代码研究之----frameworks-----status bar 状态栏
- 自定义的互斥量类,可以用于线程或进程的同步
- GNOME 终端中的快捷键大全
- linux中查找文件命令总结
- ASP.NET MVC 3 新特性
- spring2+hibernate3+struts2 真的让一切都变得简单
- 自动执行任务功能实现
- Python中正则表达式对中文的匹配问题
- 用Google Code上传备份管理代码
- merge attachDirty attachClean用法