개발

[.net] 뮤텍스(Mutex)를 통한 프로세스 다중 실행 방지

지승준 2013. 12. 19. 14:02

사용하기에 앞서 뮤텍스와 쓰레드의 개념을 잡고 들어가보자.


프로세스(Process)는 말 그대로, 독립적인 실행의 단위이다.

쓰레드(Thread)는 멀티프로세스가 지원되는 OS에서 실행의 최소 단위이다.

쓰레드가 모여서 하나의 프로세스를 구성하게 된다. 즉 프로세스를 실행하면

한개 이상의 쓰레드가 기동되는것을 의미하는 것이다.

하나의 프로세스에 여러개의 쓰레드를 기동시키기도 한다.


Mutex란 Mutual Exclusion의 약자로써, Thread가 여러개 존재 할 때 동시간에 접근을 허용하지 않는다는 의미를 가지고 있다.


(만약 Mutex에 대해 더욱 깊게 들어가고 싶으시다면, 

http://blog.naver.com/ckpj1?Redirect=Log&logNo=100015002737 

블로그를 참조해주시길 바랍니다.)


Using System.Threading;

Mutex 클래스는 System.Threading 네임스페이스에 존재하며 이것을 Using을 통해 사용해주자.


Mutex의 생성자이다.

생성자

설명

public Mutex(); 기본값으로 뮤텍스를 초기화한다.

public Mutex(bool); 호줄하는 쓰레드가 뮤텍스의 초기 소유권을 갖는지를 정한다.

public Mutex(bool, string); 뮤텍스의 이름을 정한다.

public Mutex(bool, string, bool); 뮤텍스의 초기 소유권, 뮤텍스 이름, 메소드가 뮤텍스의 초기 소유권 반환 여부



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//해당 함수와 같이 뮤텍스를 사용하는 함수를 만들어주자.
private void prevInstance() {
 
    bool createdNew;
    Mutex duplicate = new Mutex(true"MyMutex"out createdNew);
 
    try {
        if (createdNew) {
        
        duplicate.ReleaseMutex();
        
        } else {
        
            MessageBox.Show("이미 실행중입니다!""실행 오류!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            this.Close();
            
        }
    } catch (Exception ex) {}
    
}
 
 
Mutex duplicate = new Mutex(true"MyMutex"out createdNew);
//생성자를 통해 duplicate 인스턴스를 생성하면서 볼 수 있듯이, 초기 소유권을 duplicate에게 주고 이름을 MyMutex로 지정해주었다.
뮤텍스의 초기 소유권 반환 여부라는 것은, 만약 자신에게 초기 소유권이 없으면 이것을 반환해야 한다. 다시 말해, 나중에 켜진 프로세스라면 이 프로세스는 createdNew에 true가 반환될것이다.
 
duplicate.ReleaseMutex();
// if에서 createdNew가 true가 반환된다면 Mutex를 끄고 프로세스 자원을 독점한다.
 
else {
  MessageBox.Show("이미 실행중입니다!""실행 오류!", MessageBoxButtons.OK, MessageBoxIcon.Error);
  this.Close();
}
해당 소스는 createdNew가 false라면 이미 실행중이라는 경고와 함께 프로세스를 종료한다.
cs


'개발' 카테고리의 다른 글

[javascript] 중복 실행 방지  (0) 2013.12.23
[.net] 문자열의 내용을 검색하거나 조작하는 방법  (0) 2013.12.20
[javascript] 한글자씩 입력  (0) 2013.12.18
[javascript] 이미지맵  (0) 2013.12.13
[jquery] MsgBox 그리드  (0) 2013.12.13