2009. 10. 11. 21:35

Sleep 과 SwichToThread 함수

void Sleep(DWORD dwMilliseconds);

일정 시간동안 자신을 스케줄하지 않도록 운영체제에게 명령을 내릴 수 있다.

  • Sleep 을 호출하면 스레드는 자발적으로 남은 타임 슬라이스를 포기한다.
  • Sleep 함수의 매개변수로 0을 전달할 수도 있다. 이렇게 하면 이 함수를 호출한 스레드가 남은 타임 슬라이스를 자발적으로 포기하여 시스템이 다른 스레들르 스케줄하게 한다. 그런데 시스템에 이 함수를 호출한 스레드와 우선순위가 같거나 그보다 높은 스레드 중에 스케줄 가능 스레드가 없는 경우 Sleep 함수를 호출한 스레드가 다시 스케줄 될 수도 있다.

BOOL SwitchToThread();

시스템은 일정 시간 동안 CPU 시간을 받지 못하여 수행되지 못하고 있던 스레드가 있는지 확인한다. 만일 그러한 스레드가 없다면 SwitchToThread 함수는 바로 반환되지만, 그러한 스레드가 존재한다면 SwitchToThread 는 해당 스레드를 스케줄 한다. 아마도 이러한 스레드는 SwitchToThread 함수를 호출한 스레드에 비해 낮은 우선순위를 가지고 있을 것이다. CPU 시간을 할당받은 스레드는 단일 퀀텀 시간 시간 동안만 수행되며, 이후 스케줄러는 이전과 동일하게 스케줄링을 수행한다.

이 함수를 이용하면 리소스를 소유하고 있는 낮은 우선순위의 스레드가 해당 리소스를 빨리 사용하고 반환할 수 있도록 해준다. SwitchToThread 를 호출하였을 때 수행할 스레드가 없다면 FALSE 를 반환하고, 그렇지 않은 경우 0이 아닌 값을 반환한다.

------

SwitchToThread 함수를 호출하는 것은 Sleep 함수를 호출할 때 인자로 0 밀리초의 타임아웃 값을 전달하는 것과 유사하다. 차이점이라면 SwitchToThread 의 경우 함수를 호출한 스레드보다 낮은 우선순위의 스레드들도 수행될 수 있다는 점일 것이다. Sleep 함수의 경우 설사 낮은 우선순위의 스레드들이 오랫동안 CPU 시간을 받지 못했다 하더라도 Sleep 함수를 호출한 스레드를 다시 스케줄링된다.

출처 : 제프리 리처의 Windows via c/c++