2016-06-06 1 views
5

단일 스레드 콘솔 응용 프로그램에서 사람들은 종종 Thread.Sleep을 잠시 동안 응용 프로그램을 일시 중지하는 게으른 방법으로 사용합니다.수면 차단 프로그램이 종료합니까? 어떻게 구현됩니까?

이 질문은이 방법을 사용하지에 대한 흥미로운 점을 제기 : Why is Thread.Sleep so harmful

그러나 다른 수면 블록을 현재 스레드를 아는 것보다, 나는 그것이 어떻게 작동하는지 이해가 안 돼요 - 인스턴스가 밖으로 최대 CPU 코어의는 않습니다에 대한 꽉 루프 또는 실제로 스레드를 일시 중지합니까?

저에게 더 중요한 것은 잠자기 중에 잡히면 콘솔 앱이 다양한 앱 종료 시나리오 (CTRL-C, 죽이기, 창 닫기 버튼)에 어떻게 반응합니까? 운영 체제가 강제 종료 할 때까지 맹목적으로 실행을 계속할 것인가?

+4

. 확실히, 그것은 일시 중지되었습니다. 콘솔 킬은 OS에 의해 구현되고 프로세스를 종료합니다. 프로세스의 스레드가 어떤 작업을 수행하던간에 관계가 없으면 노르웨이어 앵무새 스타일이 중단됩니다. –

+1

관심있는 분들은 [Thread.Sleep()에 대한 구현]을보실 수 있습니다 (http://referencesource.microsoft.com/#mscorlib/system/threading/thread.cs,5f1072b92dae1dd8). –

+0

감사합니다. @HansPassant 'suspended'는 내가 원하는 용어입니다. Sheeo가 스핀 락으로 이어지는 대신 스레드가 일시 중단되었다고 지적한 것처럼 말입니다. 좋은 MP 참조. –

답변

5

이것은 C#/.NET 관련 질문보다 운영체제 질문에 더 가깝습니다. 그러나 간결하게 대답하려고 노력할 것입니다.

Thread.Sleep은 CPU를 회전시키지 않고 대신 기본 OS에서 적절한 메커니즘을 호출하여 스레드를 일시 중단합니다. 창에서이 함수는 다음과 같이 설명됩니다. https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx

이 일반 시스템 호출을 사용하면 시간 초과가 될 때까지 스레드를 다시 스케줄 할 수 없습니다. 스레드 (또는 전체 프로세스)를 강제 종료하는 것이 필요합니다.

cmd.exe에서 ctrl + c를 누르면 콘솔이 이벤트를 처리하기 위해 연결된 각 프로세스에서 새 스레드를 생성합니다 (여기에서 설명 : https://msdn.microsoft.com/en-us/library/windows/desktop/ms682541(v=vs.85).aspx). 이 때문에 ctrl + c를 눌렀을 때 프로그램 전체가 여전히 "잘 동작"하지만 잠자는 스레드 자체가 조기에 죽게됩니다. 우리는이 방법을 볼 수 있듯이

[System.Security.SecuritySafeCritical] // auto-generated 
public static void Sleep(int millisecondsTimeout) 
{ 
    SleepInternal(millisecondsTimeout); 
    // Ensure we don't return to app code when the pause is underway 
    if(AppDomainPauseManager.IsPaused) 
     AppDomainPauseManager.ResumeEvent.WaitOneWithoutFAS(); 
} 

Thread.SleepInternal 메소드를 호출 :

2

이것은 Thread.sleep를 방법의 소스 코드입니다. 주석에 대해서는,이 메소드가 밀리 세컨드의 타임 아웃 동안 현재의 thread를 정지시키는 것을 읽을 수가 있습니다. 다음에, timeout == 0의 경우,이 메소드는 thread로 하여금 타임 슬라이스의 나머지 부분을 포기하도록하고 타임 아웃이 Timeout.Infinite와 같으면 타임 아웃이 발생하지 않는다는 것을 읽을 수 있습니다. 다중 스레드 및 응용 프로그램 수명주기 (이 경우 특히 중단됨)에 대해 읽으십시오.

링크 : 그것은 단순히 지정된 시간에 실행 스레드 일정을 변경하지 않도록 운영 체제의 스레드 스케줄러를 알려줍니다

+0

첫 번째 링크는 Windows CE 용입니다 - OP가 사용하지 않는 것일 수도 있습니다 – pm100

+0

@ pm100 :이 링크는 어떻게 작동하는지 방법을 소개해야합니다. – hubot

관련 문제