Nice programing

Thread.SpinWait 메서드의 목적은 무엇입니까?

nicepro 2020. 12. 2. 21:54
반응형

Thread.SpinWait 메서드의 목적은 무엇입니까?


MSDN 에서 그 목적이 실제로 명확하지 않습니다.

집약적 인 CPU 계산 테스트를 시뮬레이션하는 데 사용할 수 있습니까?


아니. 매우 단기적인 수면 통화의 대체품으로 사용됩니다.

다중 스레드 잠금을 수행 할 때 획득하려는 리소스가 이미 잠겨있는 경우 일반적으로 절전 모드로 전환되어 해제 될 때까지 기다립니다. 이렇게하면 스케줄러가 할당 한 나머지 시간을 다른 사람이 사용할 수 있도록 프로세서를 사용하도록 포기하게됩니다. 일반적으로 이것은 괜찮습니다. 특히 IO 대기와 같은 긴 대기의 경우 디스크 스핀들이 회전 할 때까지 기다리는 동안 다른 프로세스의로드가 CPU에서 실행될 수 있습니다.

그러나 때로는 약간의 시간을 기다리고 있습니다. 이러한 경우에는 일반적으로 남은 시간을 포기하고 다른 모든 스레드가 작업을 수행 할 때까지 기다렸다가 다른 작업을 수행 할 수 있습니다. 그러면 기다리는 대신 속임수를 쓸 수 있습니다. 아직? ' 방법. 잠금이 남은 시간의 일부 동안 만 유지되는 경우 이는 매우 효과적인 대기 수단이되며, 포기한 시간을 사용하기 위해 스케줄러가 다른 모든 스레드를 재정렬하는 데 관여 할 필요가 없기 때문에 매우 효율적입니다. 정상적으로 기다렸다면.

분명히 잠금을 원할 때마다 회전하면 인기가 높지 않을 것이고 앱이 느려지고 100 % CPU를 사용하지만 아주 적은 양으로 적시에 앱의 응답 성을 높일 수 있습니다. .

이제 '언제 사용해야합니까?'라고 생각하고 있다면 까다로운 호출입니다. 리소스가 매우 자주 잠기고 매우 빠르게 잠금 해제되는 경우 대기 대신 스핀 락을 사용하는 것이 좋습니다. (그런 다음 앱의 성능을 테스트합니다.) 잠시 회전을 시도한 다음 정상적인 대기 상태로 돌아가는 것도 합리적인 방법입니다. 그러나 일반적으로 사용할 필요가 없습니다.


목적은 당신이 기다리고있는 상태가 실현 될 것이라고 믿는 경우 "저렴한"대기를하는 것입니다 . 일반적으로 무언가를 기다리고 있다면 스레드를 휴면 상태로두면 프로세서 / OS가 컨텍스트를 다른 스레드로 전환합니다. 컨텍스트 전환은 특별히 저렴하지 않습니다. 따라서 상황에 대한 고급 지식이 있고 컨텍스트 전환보다 기다리는 것이 더 저렴하다고 생각하는 경우 대기를 돌립니다.

내 조언 : 물어볼 필요가 있다면 그것을 사용할 필요가 없습니다. (내가 직접 원한 적이 없습니다.) 기본적으로 매우 적은 상황에서 정말 유용한 것 중 하나이지만 대부분의 사람들은 혼자서 떠나야합니다.


참고로 Microsoft는 멀티 코어 CPU에 맞게 확장되지 않았기 때문에 Windows 7에서 스레드 디스패처 스핀 락 메커니즘을 제거했습니다. 이것 좀 봐 :


내가 염려하는 한 (그리고 수정에 만족합니다!), 스핀 대기의 유일한 사용은 잠금 또는 스레드 간 콜백 메커니즘을 구현할 때입니다. 또한 이미 존재하므로 수동으로 (일반적으로) 수행해서는 안됩니다.

리소스를 잠그고 다른 스레드에서 동기화 된 액세스를 요청하면 기본적으로 첫 번째 스레드가 리소스 사용을 완료 할 때까지 기다려야합니다. 이 대기는 단순히 루프에서 회전 (또는 Jon이 언급 한대로 수면 + 컨텍스트 전환)하여 수행 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/1091135/whats-the-purpose-of-thread-spinwait-method

반응형