세마포는 신호 메커니즘입니다 („나는 끝났어, 당신은 신호의 종류를 수행 할 수 있습니다”). 예를 들어 모바일에서 노래를 듣는 동시에 친구가 전화를 걸 때 인터럽트 서비스 루틴(ISR)이 호출 처리 작업을 깨우는 신호가 트리거됩니다. EventWaitWait의 생성자는 „명명된” EventWaitHandle을 만들어 여러 프로세스에서 작동할 수 있습니다. 이름은 단순히 문자열이며 의도치 않게 다른 사람의 이름과 충돌하지 않는 값일 수 있습니다! 이름이 컴퓨터에서 이미 사용 중이면 동일한 기본 EventWaitHandle에 대한 참조가 표시됩니다. 그렇지 않으면 운영 체제에서 새 것을 만듭니다. 다음은 수동으로 잠그는 대신 선언적으로 잠그는 것입니다. ContextBoundObject에서 파생 하 고 동기화 특성을 적용 하 여 CLR 자동으로 잠금을 적용 하도록 지시 합니다. 예: 열거 하는 동안 목록이 수정 되는 경우 예외가 throw 되는 의미에서 .NET 컬렉션을 열거 하는 것은 스레드 안전 하지 않습니다. 열거 기간 동안 잠그는 대신 이 예제에서는 먼저 항목을 배열에 복사합니다. 이렇게 하면 열거 중에 수행하는 작업을 시간이 오래 걸릴 수 있는 경우 잠금을 과도하게 유지하는 것을 방지할 수 있습니다.

또 다른 해결책은 판독기/기록기 잠금을 사용하는 것입니다. 한 가지 패턴은 변경할 수 없는 개체를 사용하여 관련 필드 그룹을 캡슐화하여 잠금 기간을 최소화하는 것입니다. 매우 간단한 예제를 예로 들자면 동기화 컨텍스트의 범위가 클수록 관리하기가 쉽지만 유용한 동시성을 사용할 기회가 적다고 가정합니다. 배율의 다른 쪽 끝에서 별도의 동기화 컨텍스트는 교착 상태를 초대합니다. 예를 들어 문서가 없는 경우 메서드가 본질적으로 읽기 전용인지 여부를 가정할 때 주의해야 합니다. 좋은 예는 Random 클래스: Random.Next(호출할 때) 내부 구현에서는 개인 시드 값을 업데이트해야 합니다. 따라서 Random 클래스를 사용 하 여 주위에 잠그거나 스레드 당 별도 인스턴스를 유지 관리 해야 합니다. WaitAll 및 SignalAndWait는 단일 스레드 아파트에서 실행되지 않습니다. 다행히도 대안이 있습니다. SignalAndWait의 경우, 대기열 점프 의미체계가 필요한 경우는 드물다: 예를 들어, 랑데부 예제에서는 첫 번째 대기 핸들에서 Set을 호출한 다음 다른 한 번WaitOne을 호출하는 것이 유효합니다.

집결. 장벽 클래스에서는 스레드 랑데부를 구현하기 위한 또 다른 옵션을 살펴보겠습니다. 세마포어 클래스의 새 인스턴스를 초기화하고, 초기 엔트리 수와 최대 동시 항목 수를 지정하고, 선택적으로 시스템 세마포 개체의 이름을 지정하고, 값을 받는 변수를 지정합니다. 새 시스템 세마포가 만들어졌는지 여부입니다.