1 minute read

윈도우의 프로세스와 스레드 (3)

멀티스레드

스레드는 독자적으로 형동하는 프로세스와 크게 성질이 다르지 않습니다.

그런데 시작과 종료가 항상 스레드를 발생시킨 프로세스에 종속되어있습니다.

스레드가 종료되기전에 프로세스가 종료되어 버리면 스레드는 모두 날라가버리는 결과가 생깁니다.

대부분의 윈도우 프로그램은 메시지 큐 기반의 무한 루프를 타는 방식을 사용하므로 이런 문제가 민감하게

다가오지는 않겠지만, 경우에 따라 순차적인 프로그램을 멀티스레드로 운용하는 수가 있습니다.

일정 작업을 종료하는 순차적인 프로그램일 경우에 모 프로세스가 항상 스레드 보다 먼저 종료되지 않도록

주의하는것이 매우 중요합니다.

스레드는 프로세스와 자원을 공유한다는 장점도 있지만 이러한 문제 때문에 자원의 점유 경쟁이 벌어집니다.

자원의 점유 경쟁은 스레드 상호간에 이루어지며, 스레드를 발생시킨 픙로세스 역시 운영의 핵심은 주 스레드 이기 때문에 하나의

스레드로 취급됩니다.

자원의 경쟁때문에 실제로 프로그램이 중단되는 일은 잘 벌어지지 않지만 예상하지 못하는 결과가 종종 발생됩니다.

따라서 멀티 스레드를 사용하는 프로그램에서는 현재 원하는 변수 혹은 입출력을 다른 스레드가 쓰고있을

확률이 없는지 면밀히 검토해야합니다.

Win32 API 함수로 스레드 생성

스레드는 Win32 API 에서 생성하는 방법과 MFC 의 CWinThread 클래스를 통하는 두 가지 방법이 있습니다.

Win32 API 는 다시 CreateThread() 함수를 사용하는 API 함수와 _beginthread() 런타임 라이브러리 함수 호출이 존재합니다.

런타임 라이브러리에서 호출하는것은 근본적으로 Win32 래퍼를 통한것입니다.

당연히 API 단계에서의 스레드 생성호출이 저급 호출로 분류됩니다.

따라서 MFC 를 사용하여 멀티 스레딩을 구현한다면 근본적으로 CWinTread 다른 MFC 코드와 조화를 맞추어 사용하는것이 좋습니다.

MFC 가 거의 사용되지않는 시스템 프로그래밍 에서는 CReateThread() 함수 정도로 족합니다.

스레드는 함수를 독립적으로 실행시키는것 이상의 개념이 아닙니다.

따라서 스레드를 수행되는 함수는 C/C++ 프로그램에서 사용하는 함수와 크게 모양이 다르지않습니다.

하지만, 함수형이 DWORD 형으로 고정되고 입력값으로 VOID 형 포인터를 받아드리면됩니다.

적절한 값을 포인터로 전달하고, 해당값을 필요에따라 형변환해서 사용하면됩니다.

Reference

https://karfn84.tistory.com/entry/%ED%8E%8C%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9C%88%EB%8F%84%EC%9A%B0%EC%9D%98-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C

Categories:

Updated: