인터락 함수(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이 출력 된다
인터락 함수들 더 보기
반응형
'공부' 카테고리의 다른 글
24bit BMP 파일 읽어서 윈도우 출력 (0) | 2020.08.25 |
---|---|
VirtualAlloc 함수를 이용한 Dynamic Array Design (0) | 2020.08.15 |
쓰레드 동기화, 임계영역 접근 동기화 (0) | 2020.08.06 |
컨텍스트 스위칭 (Context Switching) (0) | 2020.08.04 |
프로세스 상태변화 (0) | 2020.08.04 |