• [C++] 쓰레드(thread)의 기본 개념 학습

    2023. 10. 6.

    by. KAEY

     


    ✨ INTRO 

    C++ 로 쓰레드의 기본 개념을 배우는데, 유용할 것 같으면서 난해한~ 뭔가가 있어서

    잘 쓰려면 한 번 복습을 하고 넘어가는게 좋겠다 싶었다.

    뭐든 글로 작성하면서 내 생각을 정리하는게 그나마 오래 기억에 남았었어서.. 😢

    아직 완생이 되지 못한 미생인 삶을 사는 나를 응원하며.

     

     


    (1) 공유 데이터를 사용하는 쓰레드 관리 (mtx)

    지역 변수로 선언된 a 가 0 일 때, 쓰레드 두 개가 둘 다 a 의 값을 변화시킨다면

    어떻게 되는가에 대한 의문이 들었다.

     

     

    void someFunction() {
    	for (int i = 0; i < 10; i++) {
            a += 1;
            std::cout << "someF's [a] " << a << std::endl;
        }
    
    void multFunction() {
        for (int i = 0; i < 10; i++) {      
            a = a + 7;
            std::cout << "multF's [a] " << a << std::endl;
        }
    }

    위와 같은 함수들을 만들고 메인 함수에서 쓰레드 선언을 통해 위 함수들을 불러올 것 임.

    쓰레드의 경우 CPU에서 작업을 처리하므로, a의 값이 매 번 다르게 출력될 것이다.

     

     

     

    같은 코드를 실행시켰는데도 위와 같이 출력되는 값이 일정하지가 않았다.

    그렇다면 공유 데이터를 사용하고 있을 때, 이런 현상을 방지하는 방법이 필요했을 것이고

    이때 사용하는 방법이 mtx 라고 한다.

     

     

    원하는 부분에 mtx.lock() 과 mtx.unlock()을 사용해서 쓰레드가 실행될 때, 락이 걸리면

    다른 쓰레드가 동시에 처리하지 못하게 끔 하는 방법이다.

    void someFunction() {
        mtx.lock();
        for (int i = 0; i < 10; i++) {
            a += 1;
            std::cout << "someF's [a] " << a << std::endl;
        }
       mtx.unlock();
    }

    위와 같이 mtx를 사용해서 락을 걸면 출력 값이 일정하게 변화하게 된다.

     

     

     

    어떤 쓰레드가 먼저 실행되는 지에 대해서는 CPU가 결정하나,

    값이 하나의 쓰레드가 락 부분에 대해서 처리하는 동안에는 다른 쓰레드가 실행되지 않는다는 것이 확인된다.

     

     

     

    🤔 그럼 문득 의문이 든게, 공동 데이터가 아니라 서로 다른 데이터를 다룬다고 해도, 이러한 현상이 생길까?

    void bmultFunction() {
        for (int i = 0; i < 10; i++) {
            b = b + 7;
            std::cout << "multF's [a] " << b << std::endl;
        }
    }

    b라는 변수를 새로 만들고 b를 다루는 쓰레드를 사용한다고 가정헀다.

    그렇다면 서로 다른 변수를 다루므로 위와 같이 값이 섞여 출력되는 현상이 생길까?

     

     

    🤷‍♂️ 쓰레드라서 그런지 역시 값이 섞이며 출력되었다. 그렇지만 공유 데이터가 아니기에,

    값이 변화하거나 하지는 않았다. 단순 더하기이기에 값이 크게 변화하진 않았지만, 곱하기나 나누기 같은 연산 등으로

    순서가 중요해지게 된다면, 값에 오류가 생길 가능성이 매우매우 높다.

    뭐 어차피 쓰레드의 쓰임은 보통 이렇게 사용자에게 보여지지 않고

    I/O 작업, 다중 클라이언트 서버, 데이터의 병렬 처리, GUI 응용 프로그램 등으로 병렬 프로그래밍을 위해 사용한다.

    절차 지향적인 C++에서 같은 프로세스 내에서 여러 일을 처리하는 방법!

     

     


    기존 코드 참고 >

     

    깃허브 링크 참조 (새 창으로 열림)

     

     


    🎉해당 글의 내용은 "포스코 x 코딩온 스마트 팩토리 과정 수업" 에서의 수업 자료 및 실습 과제 등에서 일부 발췌되어 작성 되었습니다.


    댓글 (비로그인 댓글 허용하지 않습니다.)