C#의 lock
문에서 await
사용을 금지하는 이유
C#에서는 await
연산자를 lock
문 내에서 사용할 수 없습니다. 이는 컴파일러 팀이 의도적으로 선택한 설계입니다. 이 기능을 구현하는 것은 어렵지 않지만 교착 상태를 초래할 수 있는 위험한 관행으로 간주됩니다.
제한 사유
lock
문 내에서 await
사용을 허용하면 await
이 제어를 해제하는 시점과 이후 메서드가 재개되는 시점 사이에 임의 코드가 실행됩니다. 이 코드는 원래 잠금 계층 구조와 충돌하는 순서로 잠금을 획득하여 교착 상태를 일으킬 수 있습니다.
또한 await
실행은 원래 잠금을 획득한 스레드가 아닌 다른 스레드에서 다시 시작될 수 있습니다. 이로 인해 잠금을 획득한 스레드가 아닌 다른 스레드에서 잠금을 잠금 해제할 가능성이 생기며 이는 매우 바람직하지 않습니다.
사용자 정의 잠금 구현에 미치는 영향
사용자 정의 잠금 구현(예: 주어진 코드 예제에 제공된 구현)을 사용하여 이 제한을 우회하려고 시도하면 예측할 수 없고 잠재적으로 교착 상태가 발생하기 쉬운 동작이 발생할 수 있습니다. await
작업이 진행되는 동안 다른 스레드가 잠금을 획득하면 ExitDisposable
클래스의 Monitor.Exit
호출이 무기한 차단될 수 있기 때문입니다.
결론
await
연산자는 강력한 비동기 프로그래밍 기능을 제공하지만 lock
문 내에서 await
사용 금지를 포함하여 권장 모범 사례를 따르는 것이 중요하다는 점을 이해하는 것이 중요합니다. 이 제한은 교착 상태를 방지하고 다중 스레드 코드의 안전성과 신뢰성을 보장하기 위한 것입니다.
위 내용은 C#의 `lock` 문 내에서 `await`를 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!