Top

c# 뮤텍스 예제

각 참여 스레드에 표시되는 모든 개체는 하나의 하드 규칙에 따라 동기화 개체로 사용할 수 있습니다. 동기화 개체는 일반적으로 개인(잠금 논리를 캡슐화하는 데 도움이 되기 때문에) 일반적으로 인스턴스 또는 정적 필드입니다. 다음 예제에서와 같이 동기화 개체는 보호하는 개체로 두 배가 될 수 있습니다. 매우 간단한 예를 들어, 우리는 다음과 같이 두 개의 필드를 가지고 있다고 가정: 하나의 용량을 가진 세마포는 뮤텍스 또는 잠금과 유사하다, 세마포에는 “소유자”가 없다는 것을 제외하고 – 그것은 스레드 독립적 이다. 모든 스레드는 세마포어에서 릴리스를 호출할 수 있지만 뮤텍스 및 잠금을 사용하면 잠금을 얻은 스레드만 해제할 수 있습니다. 잠금 전용 필드(예: _locker, 이전 예제에서)를 사용하면 잠금의 범위와 세분성을 정확하게 제어할 수 있습니다. 포함된 개체(이) 또는 해당 형식도 동기화 개체로 사용할 수 있습니다. 예를 들어 다음을 고려하십시오: 신호 호출은 “개수”를 감소시요; 카운트가 0으로 내려갈 때까지 대기 블록을 호출합니다. 예를 들어 txtMessage라는 텍스트 상자가 포함된 창이 있다고 가정하면 작업자 스레드가 업데이트되기를 원하는 콘텐츠가 WPF에 대한 예입니다. 각 호출 스레드는 뮤텍스의 소유권을 획득할 때까지 차단되므로 스레드의 소유권을 해제하기 위해 ReleaseMutex 메서드를 호출해야 합니다. “교착 상태를 피하기 위해 일관된 순서로 개체를 잠급기”라는 일반적인 조언은 초기 예제에서 유용하지만 방금 설명한 시나리오에는 적용하기 어렵습니다.

더 나은 전략은 자신의 개체에 대한 참조가 있을 수 있는 개체에서 메서드를 호출하는 것을 경계하는 것입니다. 또한 다른 클래스의 호출 메서드를 실제로 잠글 필요가 있는지 여부를 고려하십시오 (나중에 볼 수 있지만 때로는 다른 옵션이 있는 경우가 있습니다). 선언적 및 데이터 병렬 처리, 변경할 수 없는 형식 및 비차단 동기화 구문에 더 많이 의존하면 잠금의 필요성이 줄어듭니다. 터미널 서비스에서 실행되는 경우 컴퓨터 전체 Mutex는 일반적으로 동일한 터미널 서버 세션의 응용 프로그램에만 표시됩니다. 모든 터미널 서버 세션에 표시되도록 하려면 Global로 이름을 접두사로 지정합니다. 미숙한 뮤텍스를 획득하고 해제하는 데는 몇 마이크로초가 소요되며 잠금보다 약 50배 느립니다. 세마포어는 동시성을 제한하는 데 유용할 수 있으며 너무 많은 스레드가 한 번에 특정 코드를 실행하지 못하도록 할 수 있습니다. 다음 예제에서는 5개의 스레드가 한 번에 세 개의 스레드만 허용하는 나이트클럽에 들어가려고 합니다.