ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CreateThread,멀티 쓰레드 + (쓰레드가 필요한 이유)
    쓰레드/쓰레드 2022. 4. 3. 12:53

    한 프로그램에서 여러 가지 작업을 동시에 수행해야 할 경우가 있다.

    보통 CPU의 갯수에 따라 동시에 작업을 수행하는 것이 불가능하지만 

    동시에 수행되는 것처럼 보이게 만들 수 있는 여러 가지 방법들이있다.


    Timer를 이용한 동시 작업)

    Timer를 이용하면 동시에 여러 작업을 수행할 수 있다. 

     

    WM_SETTIMER 0.1 초 간격으로 호출되면서 도형의 색상을 변경하고 있고,

    LButton을 클릭할 경우 해당 위치에 사각형을 출력한다.

    하지만 이 방법은 문제점을 가지고 있다.

    우선 WM_TIMER 메시지는 최대 1초에 18.2 회밖에 발생하지 않으므로 좀 더 고속 처리가 필요할 때는 사용할 수 없다. 또한 타이머 메시지에서 화면을 그리는 동안은 다른 메시지를 곧바로 처리할 수 없으므로 반응성이 좋지 않다.

     


     

    멀티 스레드는 동시에 여러 작업을 수행할 수 있는 방법이다.

    전편에서 프로세스는 단지 존재하기만 한는 껍데기일 뿐이며 실제 작업은 스레드가 담당한다고 말한 바 있다.

     

    프로세스의 최초 스레드, 즉 메인스레드는 프로세스 생성 시에 자동으로 생성된다.

    따라서 그 프로세스는 싱글스레드 프로세스가 된다.

    프로세스를 멀티스레드로 하려면 메인스레드 안에서 새로운 스레드를 생성하면 된다.

    이런 식으로 생성된 새로운 스레드 안에서 또 다른 스레드를 생성할 수도 있다.

     

    CreateThread

     

    스레드 생성에는 CreateThread API를 사용한다. API는 반환값으로 새로운 스레드 핸들을 돌려준다.

    첫 번째 인자 :  스레드의 권한과 같은 보안 정보를 설정하는 부분 (특별한 이유가 없는 한 NULL을 넘겨도 상관x)

     

    두 번째 인자 : 생성하려는 스레드의 초기 스택 크기를 지정 프로세스 내의 각 스레드에서는 주소 공간 자체는 공유하지                     만, 스택 영역은 각기 다른것을 사용하기 때문 (0을 넘기면 기본 크기를 할당)

     

    세 번째 인자 : 스레드 프로시저를 지정한다. 반드시 다음과 같은 프로토타입을 사용하는 함수의 주소를 지정해야 한다.

      

        DWORD WINAPI threadFunc(LPVOID lpParameter);

     

    이 함수는 스레드에서 실행하는 처리를 담당하므로 스레드 프로시저라고 한다.

    스레드가 생성되면 프로시저의 앞부분부터 실행이 시작된다. 그리고 보통의 함수처럼 프로시저의 마지막에 도달하거나 도중의 return 문 혹은 ExitThread API 의 호출이 있을 때까지 코드에 작성된 순서대로 실행된다.

    그리고 실행이 종료되는 동시에 스레드는 소멸한다.

     

    네번째 인자 : 이 인자를 이용해서 특정 데이터를 넘겨주면 스레드마다 다르게 처리할 수 있다.

                      주고 받는 데이터가 많아서 하나로 넘길 수 없는 경우 구조체에 데이터를 저장해서 포인터를 넘기면 된다.

                      프로세스 내의 스레드는 메모리 공간을 공유하기 때문에 포인터로 서로의 데이터를 참조할 수 있다.

     

    5번째 인자 :  CREATE_SUSPENDED를 지정하면 스레드가 실행을 중지 한 상태로 만들어 진다.

                      ( Suspend Count 1 인 상태)


     

    멀티쓰레드 

     

    단일 쓰레드를 이용할 경우 즉, 프로세스 생성 그대로 프라이머리 쓰레드를 이용하면 생기는 문제점을 알아보자

     

    fun1() : 무한루프를 돌며 사각형을 칠하는 함수 

    무한루프를 돌며 사각형을 칠하는 함수

    마우스 왼쪽버튼을 클릭하면  무한 루프를 돌면서 해당 함수가 종료하지 못하기 때문에 프로그램은 더 이상의 이벤트를 처리하지 못한다. == (응답없음)

     

     

    위의 코드를 스레드를 생성하는 코드로 변경 (멀티 쓰레드) 

     

     

     

     

    실행해 보면 이전 소스와는 달리 마우스 왼쪽 버튼을 클릭해도 다른 이벤트를 처리할 수 있음을 볼 수 있다.

     

    '쓰레드 > 쓰레드' 카테고리의 다른 글

    스레드 간 동기화 ,동기화가 필요한 이유  (0) 2022.04.03
    스레드 생명 주기 + 우선순위  (0) 2022.04.03
    beginThread & TLS  (0) 2022.04.03
    쓰레드 제어, 쓰레드 종료  (0) 2022.04.03
    Process란?  (0) 2022.04.02

    댓글

Designed by Tistory.