교착상태 예제 (2)
#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 락 순서를 똑같이 해주면 교착상태에 빠지지 않는다