세마포어를 사용해서 뮤텍스 교착상태 회피하기 (2)
운영체제론 2015. 1. 6. 19:41#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;
}
역시나 윈도우 버전
'운영체제론' 카테고리의 다른 글
윈도우즈 크리티컬섹션, 뮤텍스, 이벤트, 세마포어 (0) | 2015.01.07 |
---|---|
교착상태 예제 (3) (0) | 2015.01.06 |
세마포어를 사용해서 뮤텍스 교착상태를 회피하기 (0) | 2015.01.06 |
교착상태 예제 (2) (0) | 2015.01.06 |
교착상태 예제 (0) | 2015.01.06 |