모니터 클래스에 대해 궁금합니다. 까지 기다리는 모든 스레드는 FIFO가 아닙니다. 잠금을받는 첫 번째 것이 항상 대기열에서 첫 번째로 켜지지는 않습니다. 이것이 맞습니까? FIFO 상태를 확인할 수있는 방법이 있습니까?Monitor.TryEnter()
감사
모니터 클래스에 대해 궁금합니다. 까지 기다리는 모든 스레드는 FIFO가 아닙니다. 잠금을받는 첫 번째 것이 항상 대기열에서 첫 번째로 켜지지는 않습니다. 이것이 맞습니까? FIFO 상태를 확인할 수있는 방법이 있습니까?Monitor.TryEnter()
감사
봐, 나는 그것을 것 매우 유용 당신을 위해 생각 - Does lock() guarantee acquired in order requested?
특히이 인용 : 모니터는 커널이 내부적으로 객체를 사용하기 때문에
, 그들은 같은 을 전시 OS 동기화 메커니즘도 과 비슷한 대략적인 FIFO 동작 (이전 장에서 설명 함). 모니터가 불공평하므로 깨어있는 대기 중 스레드가 잠금을 획득하려고 시도하기 전에 다른 스레드가 잠금을 획득하려고 시도하면 부적절한 스레드가 잠금을 획득하도록 허용됩니다.
내장 된 방법을 말하는 경우에는 아니오를 선택하십시오. 반복적으로 TryEnter
을 반복적으로 호출하는 것은 정의 상 불공평합니다. 불행히도 간단하지 않습니다. Monitor.Enter
. 기술적으로 스레드는 잠금을 해제하지 않고 영원히 기다릴 수 있습니다.
절대 공정성을 원한다면 도착 순서를 추적하기 위해 대기열을 사용하여 직접 구현해야합니다.
좋은 질문입니다. 이거 읽었 니? http://stackoverflow.com/questions/5111779/lock-monitor-internal-implementation-in-net – Jeb
왜 FIFA가 중요합니까? 스레드가 도착하는 순서를 보장 할 수는 없기 때문입니다. 또한 비동기 호출 프로 시저 (APC)를 사용하면 잠금 대기 중으로 돌아 오기 전에 대기 스레드를 잠시 빌려 콜백을 처리 할 수도 있습니다. –
@ChrisChilvers FIFO가 중요 할 수 있습니다! 그래서 Microsoft는 FIFO 동작을 보장하는 잠금 장치를 도입했습니다. – adelphus