一、互斥量Mutex同步多线程
1、Win32平台
相关函数和头文件
#include <windows.h>
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针
BOOLbInitialOwner, // 初始化互斥对象的所有者
LPCTSTRlpName // 指向互斥对象名的指针
);
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,//互斥量对象句柄
__in DWORD dwMilliseconds//等待时间
);
BOOL WINAPI ReleaseMutex(HANDLE hMutex);
返回值:BOOL,TRUE表示成功,FALSE表示失败。
参数表:hMutex:HANDLE,制定一个互斥体的句柄。
BOOL CloseHandle(HANDLE hObject);
参数: hObject 代表一个已打开对象handle。
返回值:
TRUE:执行成功;
FALSE:执行失败,可以调用GetLastError()获知失败原因。
源码:
从本篇开始,我对代码会进行一些封装,使之更贴近实际使用的情况。
/***MyMutex.h头文件***/
#ifndef __MY_MUTEX_H
#define __MY_MUTEX_H
#include <windows.h>
class CMyMutex
{
public:
CMyMutex();
virtual ~CMyMutex();
void Lock();
void UnLock();
private:
HANDLE m_hMutex;
};
class CAutoLock
{
public:
CAutoLock(CMyMutex* pMutex);
virtual ~CAutoLock();
private:
CMyMutex* m_pMutex;
};
#endif;
/***MyMutex.cpp文件***/
#include <iostream>
#include <windows.h>
#include "MyMutex.h"
using namespace std;
CMyMutex::CMyMutex()
{
m_hMutex = CreateMutex(NULL /*默认安全属性*/
, false /*创建线程不拥有该信号量*/
, NULL /*锁名称*/
);
}
CMyMutex::~CMyMutex()
{
if(NULL != m_hMutex)
{
CloseHandle(m_hMutex);
cout<<"m_hMutex被关闭"<<endl;
}
}
void CMyMutex::Lock()
{
if(NULL == m_hMutex)
{
cout<<"m_hMutex为空"<<endl;
return;
}
DWORD dRes = -