운영체제는 컴퓨터 자원을 안전하게 관리하여야 한다.
critical resource 에 대해 경쟁 관계가 있는 프로세스들이 존재하는 경우에 Mutual exclusion, deadlock, starvation의 제어 문제가 발생 할 수 있다.
deadlock은 세마포어를 사용하여 해결 할 수 있다. 세마포어는 카운트 값을 주고 critical section에 접근 할 수 있는 프로세스의 수의 제한을 두어 프로세스가 자원을 점유할 때 카운트를 -1 해주고 자원을 반납할 때 +1 해주는 식으로 deadlock을 해결한다.
Mutex는 2진 세마포어와 비슷하다.(카운트 = 1, 쓰레드) 자원에 오로지 하나의 쓰레드만 접근 할 수 있게 한다.
Mutex를 사용하여 중복 실행 방지코드를 작성해보자.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int add_mutex() | |
{ | |
//이미 실행중인 쓰레드의 검사를 위한 MutexInstance 생성 | |
HANDLE hMutexInstance; | |
hMutexInstance = CreateMutex(NULL, FALSE, _T("mal")); | |
//같은 이름의 MutexInstance가 이미 존재하고 있다면 에러 리턴 | |
if(GetLastError() == ERROR_ALREADY_EXISTS){ | |
CloseHandle(hMutexInstance); | |
MessageBox(NULL, "이미 다른 인스턴스가 실행중입니다.", "실행 실패", MB_OK);( | |
return 0; | |
} | |
return 1; | |
} |
CreateMutex 함수로 MutexInstance를 생성(3번째 인자가 고유네임)한다.
CreateMutex 함수를 호출 하였는데 고유네임으로 이미 뮤텍스가 생성 되 있다면 CreateMutex함수는 ERROR_ALREADY_EXISTS 에러를 리턴하게된다.
프로세스 메인 쓰레드에 MutexInstance를 생성해 놓으면 CreateMutex 함수의 에러코드를 확인해 중복 실행을 방지 할 수 있다.
0 개의 댓글:
댓글 쓰기