2012-02-14 1 views
5

모니터 클래스에 대해 궁금합니다. 까지 기다리는 모든 스레드는 FIFO가 아닙니다. 잠금을받는 첫 번째 것이 항상 대기열에서 첫 번째로 켜지지는 않습니다. 이것이 맞습니까? FIFO 상태를 확인할 수있는 방법이 있습니까?Monitor.TryEnter()

감사

+0

좋은 질문입니다. 이거 읽었 니? http://stackoverflow.com/questions/5111779/lock-monitor-internal-implementation-in-net – Jeb

+0

왜 FIFA가 중요합니까? 스레드가 도착하는 순서를 보장 할 수는 없기 때문입니다. 또한 비동기 호출 프로 시저 (APC)를 사용하면 잠금 대기 중으로 돌아 오기 전에 대기 스레드를 잠시 빌려 콜백을 처리 할 수도 있습니다. –

+0

@ChrisChilvers FIFO가 중요 할 수 있습니다! 그래서 Microsoft는 FIFO 동작을 보장하는 잠금 장치를 도입했습니다. – adelphus

답변

2
이 질문에

봐, 나는 그것을 것 매우 유용 당신을 위해 생각 - Does lock() guarantee acquired in order requested?

특히이 인용 : 모니터는 커널이 내부적으로 객체를 사용하기 때문에

, 그들은 같은 을 전시 OS 동기화 메커니즘도 과 비슷한 대략적인 FIFO 동작 (이전 장에서 설명 함). 모니터가 불공평하므로 깨어있는 대기 중 스레드가 잠금을 획득하려고 시도하기 전에 다른 스레드가 잠금을 획득하려고 시도하면 부적절한 스레드가 잠금을 획득하도록 허용됩니다.

3

내장 된 방법을 말하는 경우에는 아니오를 선택하십시오. 반복적으로 TryEnter을 반복적으로 호출하는 것은 정의 상 불공평합니다. 불행히도 간단하지 않습니다. Monitor.Enter. 기술적으로 스레드는 잠금을 해제하지 않고 영원히 기다릴 수 있습니다.

절대 공정성을 원한다면 도착 순서를 추적하기 위해 대기열을 사용하여 직접 구현해야합니다.

3

FIFO 조건을 보장하는 방법이 있습니까?

단어 : 아니요!

이 글에 대한 짧은 글을 읽었습니다. Is the Ready Queue FIFO?

관련 문제