c# autoresetevent 예제

생산자/소비자 큐는 일반적으로 (동일한) 작업이 수행되는 데이터 항목을 보유합니다. 예를 들어 데이터 항목은 파일 이름일 수 있으며 해당 파일을 암호화하는 작업이 될 수 있습니다. 각 참여 스레드에 표시되는 모든 개체는 하나의 하드 규칙에 따라 동기화 개체로 사용할 수 있습니다. 동기화 개체는 일반적으로 개인(잠금 논리를 캡슐화하는 데 도움이 되기 때문에) 일반적으로 인스턴스 또는 정적 필드입니다. 동기화 개체는 다음 예제에서와 마찬가지로 _list 필드와 마찬가지로 보호하는 개체로 두 배가 될 수 있습니다. 이 예제에서는 잠금의 단순성과 성능 간에 실질적인 타협을 선택합니다. 우리의 디자인은 실제로 비효율성에 대한 매우 작은 잠재력을 만듭니다 : 두 스레드가 동시에 동일한 이전에 검색되지 않은 ID로이 메서드를 호출하면 RetrieveUser 메서드가 두 번 호출되고 사전이 불필요하게 업데이트됩니다. 전체 메서드에서 한 번 잠그면 이를 방지할 수 있지만 비효율성이 더 심해지면 전체 캐시가 RetrieveUser 호출 기간 동안 잠기고 이 기간 동안 다른 스레드가 모든 사용자를 검색할 때 차단됩니다. 한 가지 패턴은 변경할 수 없는 개체를 사용하여 관련 필드 그룹을 캡슐화하여 잠금 기간을 최소화하는 것입니다. 매우 간단한 예를 들자면 다음과 같이 두 개의 필드가 있다고 가정합니다. 우리가 필요로하는 몇 가지 WaitHandles는 실행 순서를 제어하는 데 사용되는 몇 가지 WaitHandles입니다, 여기서 단계 2는 그 단계 1 신호를 WaitHandle에 대기하고, 3 단계는 그 단계 2 신호에 대기합니다. 간단한, 응? 예제 코드가 표시되나요? 다음은 AutoResetEvent: 동기화 컨텍스트의 범위가 클수록 관리하기 가 쉽지만 유용한 동시성을 위한 기회는 줄어듭니다. 배율의 다른 쪽 끝에서 별도의 동기화 컨텍스트는 교착 상태를 초대합니다.

예를 들어 잠금 블록 내에서 예외가 throw되면 잠금에서 제공하는 원자성이 위반됩니다. 예를 들어, 다음을 고려하십시오: 이 문서에서는 C# 예제를 사용하여 가장 간단한 대기 구문을 사용하여 단일 또는 여러 스레드를 기다리는 방법에 대해 설명했습니다. 이는 한 작업의 결과가 다른 작업을 계속할 때까지 기다려야 하는 다중 스레드 시나리오에서 매우 유용할 수 있습니다. 솔직히 말해서, 뮤텍스가 .NET에 배치되는 원칙적 사용은 앞에서 언급한 것입니다 – 응용 프로그램의 다른 인스턴스가 이미 실행 중임을 감지합니다. 대부분의 사람들은 이러한 수준의 프로세스 간 통신이 필요하지 않습니다. 다른 용도는 WaitHandles 집합 중 하나 또는 전부가 해제될 때까지 차단할 수 있도록 하는 것입니다. 모니터가 충분히 좋은 다른 목적을 위해, 나는 그것을 사용하는 것이 좋습니다 – 특히 C #에는 특히 이를 지원하기 위해 lock 문이 있습니다.

Posted in Uncategorized