マルチスレッド同期反発による独自のリソースロックの作成

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;

}


以上は、イベントを使用してロックプログラムを作成しました.このロックは、同じプロセス内の異なるスレッド間で使用できますが、複数のプロセス内の異なるスレッドでは機能しません.