티스토리 뷰

책 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍

 

1 ) 임계영역(Critical Section) 동기화 

 

- 크리티컬 섹션 오브젝트 변수 선언

CRITICAL_SECTION   hCriticalSection;

- 오브젝트 초기화

InitializeCriticalSection(&hCriticalSection);

- 임계영역 지정

EnterCriticalSection(&hCriticalSection); //임계영역 지정
    /*************
    임계영역
    *************/
LeaveCriticalSection(&hCriticalSection); //임계영역 탈출

- 임계영역 삭제

DeleteCriticalSection(&hCriticalSection);

 

예제

더보기
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <tchar.h>

#define NUM_OF_GATE		6
LONG gTotalCount = 0;

CRITICAL_SECTION   hCriticalSection;

void IncreaseCount()
{
	EnterCriticalSection(&hCriticalSection);
	gTotalCount++;
	LeaveCriticalSection(&hCriticalSection);
}


unsigned int WINAPI ThreadProc(LPVOID lpParam)
{
	for (DWORD i = 0; i < 1000; i++)
	{
		IncreaseCount();
	}
	return 0;
}

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

	InitializeCriticalSection(&hCriticalSection);

	for (DWORD i = 0; i < NUM_OF_GATE; i++)
	{
		hThread[i] = (HANDLE)
			_beginthreadex(
				NULL,
				0,
				ThreadProc,
				NULL,
				CREATE_SUSPENDED,
				(unsigned*)&dwThreadId[i]
			);

		if (hThread[i] == NULL)
		{
			_tprintf(_T("Thread creation fault! \n"));
			return -1;
		}
	}

	for (DWORD i = 0; i < NUM_OF_GATE; i++)
	{
		ResumeThread(hThread[i]);
	}

	WaitForMultipleObjects(NUM_OF_GATE, hThread, TRUE, INFINITE);

	_tprintf(_T("total count: %d \n"), gTotalCount);

	for (DWORD i = 0; i < NUM_OF_GATE; i++)
	{
		CloseHandle(hThread[i]);
	}

	DeleteCriticalSection(&hCriticalSection);

	return 0;
}

 

2 ) 인터락 함수(Interlocked Family Of Function) 기반의 동기화

- 전역으로 선언된 변수 하나의 접근방식을 동기화하는 것이 목적일 때

- 값을 하나 증가시키는 함수

LONG InterlockedIncrememt(
	LONG volatile* Addend
);

- 값을 하나 감소시키는 함수

LONG InterlockedDecrement(
	LONG volatile* Addend
);

이 외에도 다양한 함수 존재함.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함