mutex를 이용한 중복실행 방지


운영체제는 컴퓨터 자원을 안전하게 관리하여야 한다.
critical resource 에 대해 경쟁 관계가 있는 프로세스들이 존재하는 경우에 Mutual exclusion, deadlock, starvation의 제어 문제가 발생 할 수 있다.

deadlock은 세마포어를 사용하여 해결 할 수 있다. 세마포어는 카운트 값을 주고 critical section에 접근 할 수 있는 프로세스의 수의 제한을 두어 프로세스가 자원을 점유할 때 카운트를 -1 해주고 자원을 반납할 때 +1 해주는 식으로 deadlock을 해결한다.
Mutex는 2진 세마포어와 비슷하다.(카운트 = 1, 쓰레드) 자원에 오로지 하나의 쓰레드만 접근 할 수 있게 한다.

Mutex를 사용하여 중복 실행 방지코드를 작성해보자.


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;
}
view raw addmutex.c hosted with ❤ by GitHub

CreateMutex 함수로 MutexInstance를 생성(3번째 인자가 고유네임)한다.
CreateMutex 함수를 호출 하였는데 고유네임으로 이미 뮤텍스가 생성 되 있다면 CreateMutex함수는 ERROR_ALREADY_EXISTS 에러를 리턴하게된다.
프로세스 메인 쓰레드에 MutexInstance를 생성해 놓으면 CreateMutex 함수의 에러코드를 확인해 중복 실행을 방지 할 수 있다.

0 개의 댓글:

댓글 쓰기