문제

뮤텍스를 획득 한 다음 종료하는 몇 가지 스레드가 있습니다.

뮤 테스는 메인 리포지토리에 저장되며 프로그램이 존재할 때 올바르게 출시됩니다. 그러나 뮤텍스를 할당 한 스레드가 존재하면 뮤텍스가 자동으로 방출되고 후속 획득 획득 ( 문서).

이 예외를 피하고 할당 스레드가 완료된 후에도 뮤텍스를 계속 사용하려면 어떻게해야합니까? .NET에는이 제한이없는 또 다른 적절한 동기화 구조가 있습니까?

메모 - MUTEX와 비슷한 의미론을 가진 크로스 프로세스 동기 메커니즘을 찾고 있습니다.

도움이 되었습니까?

해결책 2

Eventwaithandle이 내가 원하는 것을하는 것처럼 보입니다. 이름을 가진 생성자가 있으므로 크로스 프로세스 동기화에 적합 하며이 문제가 없습니다.

다른 팁

질문에 대한 응답

Afaik 그러한 MUTEX 클래스는 없습니다. PoldandedMutexException은 매우 성가 시지만 자동 솔루션이없는 실제 상황을 나타냅니다.

교차 프로세스 또는 크로스 스레드 커뮤니케이션이있는 경우, 참여 엔티티 중 하나가 여러 가지 이유로 갑자기 예상치 못한 종료 될 수 있다는 사실을 처리해야합니다. MUTEX는 자원을 보호하기 위해 존재합니다. 스레드가 버려진 경우 MUTEX를 유지하는 경우 OS가 일관된 방식으로 데이터를 남겨 두는 방법이 없습니다. 이는 실의 포기가 다른 스레드에 의해 의존하는 특정 불변량을 무효화했을 수 있기 때문에 매우 중요합니다.

PoldandedMutexexception은 "나쁜 일이 일어 났고 이제는 불확실한 상태에 있습니다"라고 적극적으로 말하는 방법입니다. 여기에는 운영 체제에 대한 다른 회수가 없습니다.

귀하의 답변에 대한 응답

eventwaithandle은 뮤텍스와 다른 목적을 제공하는 것과 다릅니다.

MUTEX는 잠금 문과 매우 유사한 특정 리소스를 보호하는 데 사용됩니다. 특정 스레드가 뮤트를 획득하면 뮤텍스를 소유한다고합니다. 한 번에 하나의 소유자 만있을 수 있습니다. 따라서 관련된 모든 스레드가 Mutex의 소유권이있을 때만 리소스 만 터치하는 데 동의하는 경우 Thread.S에서 자원에 안전하게 액세스 할 수 있습니다.

eventwaithandle은 스레드 안전 이벤트로 어느 정도 시각화 될 수 있습니다. 그것은 신호 및 서명되지 않은 개념을 가지고 있으며, 많은 스레드가 신호 상태에 부딪히기를 기다릴 수 있습니다. 신호가 표시되면 대기 스레드 중 하나가 깨어나고 처리를 시작합니다.

eventwaithandle을 사용하여 스레드 안전 형태를 구현할 수 있습니다. 자물쇠 소유권이 리소스에 액세스하는 데 열쇠가되는 대신 이벤트에서 신호를 보내는 것이 리소스에 액세스하는 열쇠입니다. 그러나 악마는 다시 세부 사항에 있습니다.

  1. 누가 이벤트 신호를 담당하고 있습니까? 뮤트를 사용하면 모든 스레드는 본질적으로 "Me Me Me"를 비명을 지르고 OS는 하나의 스레드를 선택하여 승리합니다. eventwaithandle을 사용하면 다음 스레드가 언제 갈지 결정해야합니다.
  2. 누군가가 TaskMgr을 통해 프로세스를 죽일 때 어떻게됩니까? 죽인 프로세스에 현재 eventwaithandle의 이벤트에 응답하는 스레드가 있으면 어떻게해야합니까?
  3. 2 그러나 다음에 대기 핸들을 알리는 항목이 내려 오면 어떻게됩니까? 교착 상태를 피하기 위해 이것을 설명해야합니다.

수신 후 뮤텍스를 사용하지 못하게하는 것은 없습니다. AbandonedMutexException. 로부터 문서:

MUTEX의 소유권을 요청하는 다음 스레드는 데이터 구조의 무결성을 확인할 수있는 경우이 예외를 처리하고 진행할 수 있습니다.

물론 이것은 당신을 가정합니다 알다 당신과 당신의 스레드가 충돌하는 동안하고있는 일, 그리고 기본적으로 획득 스레드가 종료하기 전에 뮤텍스를 방출 할 수 있음을 의미합니다.

따라서 결국 사용하는 솔루션 EvenWaitHandle 뮤텍스보다 더 나은 것입니다.

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