728x90

Event + Mutex

- 수동 리셋 모드로 두 개 이상의 쓰레드를 실행할 때 하나의 콘솔 메모리 영역에 출력하기 때문에 임계영역으로 처리를 해야 함

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <process.h>

TCHAR string[100];
HANDLE hEvent;
HANDLE hMutex;

unsigned int WINAPI OutputThreadFunction(LPVOID lpParam)
{
	WaitForSingleObject(hEvent, INFINITE);	// 이벤트 상태가 Signaled 상태가 되기를 기다림
	WaitForSingleObject(hMutex, INFINITE);

	_fputts(_T("Output String : "), stdout);
	_fputts(string, stdout);

	ReleaseMutex(hMutex);
	return 0;
}

unsigned int WINAPI CountThreadFunction(LPVOID lpParam)
{
	WaitForSingleObject(hEvent, INFINITE);	// 이벤트 상태가 Signaled 상태가 되기를 기다림
	WaitForSingleObject(hMutex, INFINITE);

	_tprintf(_T("Output String length : %d \n"), (_tcslen(string) - 1));

	ReleaseMutex(hMutex);
	return 0;
}

int _tmain(int argc, TCHAR* argv[])
{
	HANDLE hThread[2];
	DWORD dwThreadID[2];

	hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	hMutex = CreateMutex(NULL, FALSE, NULL);

	if (hEvent == NULL || hMutex == NULL)
	{
		_fputts(_T("Event or Mutex createion error\n"), stdout);
		return -1;
	}

	hThread[0] = (HANDLE)_beginthreadex(NULL, 0, OutputThreadFunction, NULL, 0, (unsigned*)& dwThreadID[0]);
	hThread[1] = (HANDLE)_beginthreadex(NULL, 0, CountThreadFunction, NULL, 0, (unsigned*)& dwThreadID[1]);

	if (hThread[0] == NULL || hThread[1] == NULL)
	{
		_fputts(_T("thread createion error\n"), stdout);
		return -1;
	}

	_fputts(_T("Insert String : "), stdout);
	_fgetts(string, 30, stdin);

	SetEvent(hEvent);		// 이벤트 오브젝트 상태를 Signaled 상태로 변경

	WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
	CloseHandle(hEvent);
	CloseHandle(hMutex);
	CloseHandle(hThread[0]);
	CloseHandle(hThread[1]);

	return 0;
}

728x90

+ Recent posts