공부

쓰레드 동기화 인터락 함수

글로벌디노 2020. 8. 6. 23:51

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

 

이전 예제와 같이 전역으로 선언된 변수 하나의 접근방식을 동기화하는 것이 목적이라면, 이러한 용도로 특화된 인터락 함수를 사용하는 것도 나쁘지 않다. 인터락 함수는 함수 내부적으로 한 순간에 하나의 쓰레드에 의해서만 실행되도록 동기화 되어 있다.

 

변수 값 증가 (32비트)

LONG InterlockedIncrement(
  LONG volatile *Addend
);

 

변수 값 감소 (32비트)

LONG InterlockedDecrement(
  LONG volatile *Addend
);

 

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

#define NUM_OF_GATE 6

LONG gTotalCount = 0;

void IncreaseCount()
{
	// ++gTotalCount;	// 임계영역
	InterlockedIncrement(&gTotalCount);
}

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

	return 0;
}

int _tmain()
{
	HANDLE hThread[NUM_OF_GATE];

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

		if (hThread[i] == NULL)
		{
			_tprintf(_T("Thread Creation Fail <%d> \n"), i);
				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]);

	return 0;
}

 

여러번 출력결과 6000이 출력 된다

 

 

인터락 함수들 더 보기

MSDN

 

Interlocked Variable Access - Win32 apps

Interlocked Variable Access In this article --> Applications must synchronize access to variables that are shared by multiple threads. Applications must also ensure that operations on these variables are performed atomically (performed in their entirety or

docs.microsoft.com

 

반응형