세마포어를 사용해서 뮤텍스 교착상태 회피하기 (2)
#include <stdio.h>
#include <Windows.h>
int print1 = 0;
int print2 = 0;
HANDLE hMutex1; // 뮤텍스1
HANDLE hMutex2; // 뮤텍스2
HANDLE hSemaphore1; // 세마포어1
HANDLE hSemaphore2; // 세마포어2
// 실행될 스레드 1
unsigned int NewThread01(void* pParam)
{
while(1)
{
WaitForSingleObject(hSemaphore1, INFINITE);//세마포어 1번 카운터 감소 카운터가 0이면 무시
WaitForSingleObject(hMutex1, INFINITE); // 뮤텍스1
WaitForSingleObject(hMutex2, INFINITE); // 뮤텍스2
print1++;
ReleaseMutex(hMutex2); // 뮤텍스2 해제
ReleaseMutex(hMutex1); // 뮤텍스1 해제
ReleaseSemaphore(hSemaphore2, 1, NULL); // 세마포어 2번 카운터 증가
}
return 0;
}
// 실행될 스레드 2
unsigned int NewThread02(void* pParam)
{
while(1)
{
WaitForSingleObject(hSemaphore2, INFINITE);//세마포어 2번 카운터 감소 카운터가 0이면 무시
WaitForSingleObject(hMutex2, INFINITE); // 뮤텍스2
WaitForSingleObject(hMutex1, INFINITE); // 뮤텍스1
print2++;
ReleaseMutex(hMutex1); // 뮤텍스1 해제
ReleaseMutex(hMutex2); // 뮤텍스2 해제
ReleaseSemaphore(hSemaphore1, 1, NULL); // 세마포어 1번 카운터 증가
}
return 0;
}
int main(int argc, char* argv[])
{
hMutex1 = CreateMutex(NULL, FALSE, NULL); // 뮤텍스1 초기화
hMutex2 = CreateMutex(NULL, FALSE, NULL); // 뮤텍스2 초기화
hSemaphore1 = CreateSemaphore(NULL, 1, 1, NULL); // 세마포어1 초기화 초기 카운터값1 최대 카운터값1
hSemaphore2 = CreateSemaphore(NULL, 0, 1, NULL); // 세마포어1 초기화 초기 카운터값0 최대 카운터값1;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)NewThread01, 0, 0, NULL); // 스레드01 생성
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)NewThread02, 0, 0, NULL); // 스레드02 생성
while(1)
{
printf("thread 1 : %d\tthread 2 : %d\n", print1, print2);
Sleep(400); // 관찰을 위한 Sleep
}
CloseHandle(hMutex1); // 뮤텍스1 소멸
CloseHandle(hMutex2); // 뮤텍스2 소멸
CloseHandle(hSemaphore1);// 세마포어1 소멸
CloseHandle(hSemaphore2);// 세마포어2 소멸
return 1;
}
역시나 윈도우 버전