문제

한 번에 여러 개의 프로그램 인스턴스가 실행될 수 있는 상황이 있는데, 하나의 특정 함수가 이러한 인스턴스 중 두 개 이상에서 동시에 실행되지 않는 것이 중요합니다.

이런 일이 발생하지 않도록 뮤텍스를 사용하는 올바른 방법입니까?

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의 답변은 프로세스 간 잠금에 적합합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top