マルチスレッド同期反発による独自のリソースロックの作成
2426 ワード
#include <Windows.h>
#include <iostream>
using namespace std;
class CMyLock
{
public:
CMyLock();
~CMyLock();
public:
bool Lock();
bool UnLock();
private:
HANDLE hEvent;
};
CMyLock::CMyLock()
{
}
CMyLock::~CMyLock()
{
CloseHandle(hEvent);
}
bool CMyLock::Lock()
{
hEvent = OpenEvent(EVENT_ALL_ACCESS,TRUE,L"GaoHanEvent");
if (hEvent)
{
WaitForSingleObject(hEvent,INFINITE);
}
else
{
hEvent = CreateEvent(NULL,TRUE,TRUE,L"GaoHanEvent");
SetEvent(hEvent);
}
ResetEvent(hEvent);
return TRUE;
}
bool CMyLock::UnLock()
{
SetEvent(hEvent);
return TRUE;
}
CMyLock lock;
DWORD WINAPI SonThreadFun( LPVOID lpThreadParameter );
int main()
{
HANDLE hThread = CreateThread(NULL,0,SonThreadFun,NULL,CREATE_ALWAYS,NULL);
if (!hThread)
{
return 0;
}
Sleep(1000);
lock.Lock();
cout<<"The Father Play Roles"<<endl;
lock.UnLock();
WaitForSingleObject(hThread,INFINITE);
return 0;
}
DWORD WINAPI SonThreadFun( LPVOID lpThreadParameter )
{
lock.Lock();
cout<<"The Son Play Roles"<<endl;
Sleep(10000);
lock.UnLock();
return 0;
}
説明:これはWindowsの下で、Event(イベント)を使用してロックを作成します.このロックはアクセスの競合を防止します.
#include <iostream>
#include <Windows.h>
using namespace std;
class CLock
{
public:
CLock():hd(NULL){}
~CLock(){CloseHandle(hd);
}
public:
bool Lock()
{
hd = OpenMutex(MUTEX_ALL_ACCESS,TRUE,L"GaoHanMutex");
if (hd)
{
WaitForSingleObject(hd,INFINITE);
}
else
{
hd = CreateMutex(NULL,TRUE,L"GaoHanMutex");
}
return true;
}
bool unLock()
{
if (hd)
ReleaseMutex(hd);
return true;
}
private:
HANDLE hd;
};
CLock lock;
DWORD WINAPI ThreadFunc( LPVOID lpThreadParameter );
int main()
{
HANDLE hThread = CreateThread(NULL,0,ThreadFunc,NULL,CREATE_ALWAYS,NULL);
Sleep(1000);
lock.Lock();
cout<<" , "<<endl;
lock.unLock();
WaitForSingleObject(hThread,INFINITE);
return 0;
}
DWORD WINAPI ThreadFunc( LPVOID lpThreadParameter )
{
lock.Lock();
Sleep(10000);
cout<<" 10 , "<<endl;
lock.unLock();
return 0;
}
以上は、イベントを使用してロックプログラムを作成しました.このロックは、同じプロセス内の異なるスレッド間で使用できますが、複数のプロセス内の異なるスレッドでは機能しません.