운영체제론

교착상태 예제 (2)

레아라 2015. 1. 6. 11:15

#include <stdio.h>

#include <Windows.h>


int g_A = 0;

int g_B = 0;


CRITICAL_SECTION g_csA; // 크리티컬섹션 A

CRITICAL_SECTION g_csB; // 크리티컬섹션 B


// 실행될 스레드 1

unsigned int NewThread01(void* pParam)

{

while(1)

{

EnterCriticalSection(&g_csA); // 크리티컬섹션 A

EnterCriticalSection(&g_csB); // 크리티컬섹션 B


g_A++;

g_B++;


LeaveCriticalSection(&g_csB); // 크리티컬섹션 B 해제

LeaveCriticalSection(&g_csA); // 크리티컬섹션 A 해제


Sleep(50); // 관찰을 위한 Sleep

}

}


// 실행될 스레드 2

unsigned int NewThread02(void* pParam)

{

while(1)

{

EnterCriticalSection(&g_csB); // 크리티컬섹션 B

EnterCriticalSection(&g_csA); // 크리티컬섹션 A


g_B++;

g_A++;


LeaveCriticalSection(&g_csA); // 크리티컬섹션 A 해제

LeaveCriticalSection(&g_csB); // 크리티컬섹션 B 해제


Sleep(50); // 관찰을 위한 Sleep

}

}


int main(int argc, char* argv[])

{

InitializeCriticalSection(&g_csB); // 크리티컬섹션 B 초기화

InitializeCriticalSection(&g_csA); // 크리티컬섹션 A 초기화


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("A : %d\tB : %d\n", g_A, g_B);


Sleep(500); // 관찰을 위한 Sleep


}


DeleteCriticalSection(&g_csA); // 크리티컬섹션 A 삭제

DeleteCriticalSection(&g_csB); // 크리티컬섹션 B 삭제


return 1;

}



흔히 검색하면 나오는 크리티컬색션을 이용한 교착상태 예제


기본적으로 데드락을 거는 방식은 뮤텍스랑 똑같음;;;


교착상태 해결방법은 1번 스레드와 2번 스레드의 A,B 락 순서를 똑같이 해주면 교착상태에 빠지지 않는다