본문 바로가기

C#

[C#] Thread.SpinWait와 SpinWait 구조체의 차이

.Net 에서는 SpinWait을 할 수 있는 두가지 방법을 제공한다

첫번째는 Thread.SpinWait 메소드이고

두번째는 SpinWait구조체를 사용하는것이다.


이 두가지 방법은 busy waiting을 수행한다는점에서는 같은 역할을 하지만,
실제 동작에 있어서 몇가지 차이점을 가진다.

  • 일단 SpinWait 구조체는 Thread.SpinWait의 래핑이다. SpinWait는 Thread.SpinWait를 이용하여 구현되었다.
  • Thread.SpinWait는 주어진 iterationCount만큼만 스핀한다, SpinWait의 SpinOnce는 딱 1회 스핀을 수행하는것이 아니다. 지금까지 얼마나 돌았는지 보고 적적한 스핀 횟수만큼 스핀하게 된다. (따라서 SpinWait를 미리 만들어놓고 재사용하는건 좋지 않다)
  • Thread.SpinWait는 스핀 횟수와 관계 없이 스케쥴링된 타임을 절대 양보하지 않는다. 딱 한가지 양보하는 것은 같은 코어에서 동시에 돌아가고 있는 쓰레드에게는 양보한다. (YieldProcessor)
  • SpinWait는 때때로 스케쥴링을 양보하기도 한다 (SwitchToThread), NextSpinWillYield 프로퍼티를 이용해 다음 스핀이 스케쥴링을 양보할것인지 조사할 수 있다. 


상황에 따라 적절한 것을 사용하면 되겠지만, 대부분의 경우에 SpinWait가 더 좋은 선택이라고 볼 수 있다. SpinWait는 Thread.SpinWait를 래핑하여 알아서 돌만큼 돌고, 쉴만큼 쉬는것이 구현된 좀더 고수준의 스핀이다.

'C#' 카테고리의 다른 글

[C#] string과 String의 차이  (0) 2015.11.11
[C#] Using static 사용하기  (0) 2015.10.21
[C#] Mixin 흉내내기  (0) 2015.10.20
[C#] Thread.Sleep의 await(Task) 버전  (0) 2015.10.19
[PostSharp] ReaderWriterSynchronized  (0) 2015.10.15