1. 커널이 CPU의 점유를 관리하는 최소 단위가 스레드여서

단순한 이유

2. 운영체제에서 제공하는 비동기가 만만하지 않아서.

윈도우 기준으로 네이티브? 하게 제공되는 비동기는 Overlapped IO(스펠링 틀렸을 수 있음)임.

예는 함수를 호출하여 IO작업이 끝났는지, 진행 중인지 확인하는 방법으로 비동기를 제공함.

자 그러면 이 overlapped io를 별도의 스레드 없이 어떻게 GUI 프로그램에서 사용할 수 있냐면

두 가지임.

윈도우 메시지 수신을 폴링하는 방법

// 파일을 Overlapped로 열고 읽기를 위해서 시작

while(true)

{

    if(PeekMessage( ... ))

    {

        DispatchMessage( );

    }

    else

    {

        if(GetOverlappedResult() == COMPLETE)

        {

               // 완료되었을 때의 처리

        }

        Sleep(0); // Polling 으로 인한 CPU 점유율을 낮춰야 함

    }

}


타이머를 이용한 방법

while(GetMessage(...))

{

   DispatchMessage(...);

}


LRESULT CALLBACK WndProc(...)

{

    switch(msg)

   {

        case WM_TIMER:

        {

            

             if(GetOverlappedResult() == COMPLETE)

             {

               // 완료되었을 때의 처리

             }

        }

   }

}


이런 식으로 일반적인 고수준 언어에서 제공하는 비동기와는 그 모습이 다름. 이런 경우에는 그냥 스레드를 생성해서 별도로 처리하는 것이 코드 보기가 깔끔함.