문제
한 번에 여러 개의 프로그램 인스턴스가 실행될 수 있는 상황이 있는데, 하나의 특정 함수가 이러한 인스턴스 중 두 개 이상에서 동시에 실행되지 않는 것이 중요합니다.
이런 일이 발생하지 않도록 뮤텍스를 사용하는 올바른 방법입니까?
lock (this.GetType()) {
_log.Info("Doing Sync");
DoSync();
_log.Info("Sync Completed");
}
해결책
하나의 응용 프로그램에 여러 인스턴스가 있다고 하셨으니 두 개의 program.exe가 실행되고 있다는 뜻이죠?lock 문은 여러 프로그램에 걸쳐 잠기지 않고 프로그램 내에서만 잠깁니다.진정한 Mutex를 원한다면 시스템.스레딩.뮤텍스 물체.
사용 예는 다음과 같습니다.
bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
try
{
mtx.WaitOne();
MessageBox.Show("Click OK to release the mutex.");
}
finally
{
mtx.ReleaseMutex();
}
}
CreatedNew 변수는 처음 생성되었는지 여부를 알려줍니다.하지만 생성되었는지 여부만 알려줍니다.잠금을 획득하려면 WaitOne을 호출한 다음 ReleaseMutex를 호출하여 잠금을 해제해야 합니다.Mutex를 생성했는지 확인하고 싶다면 그냥 구성해도 괜찮습니다.
다른 팁
TheSeeker님 말씀이 맞습니다.
제프 리히터(Jeff Richter)의 조언 C#을 통한 Clr (p638-9) 잠금에 대한 것은 특별히 잠길 목적으로 개인 객체를 생성하는 것입니다.
private Object _lock = new Object();
// usage
lock( _lock )
{
// thread-safe code here..
}
이는 현재 클래스 외부의 어떤 것으로도 _lock을 잠글 수 없기 때문에 작동합니다.
편집하다:이는 단일 프로세스 내에서 실행되는 스레드에 적용 가능합니다.@David Mohundro의 답변은 프로세스 간 잠금에 적합합니다.
제휴하지 않습니다 StackOverflow