본문 바로가기
💻 programming/c++

[c++] thread

by 연구원-A 2021. 8. 4.
반응형

요즘은 고성능 프로그램을 만들 때 멀티코어를 얼마나 잘 활용하느냐를 중요하게 여깁니다. C++ 11부터는 thread 라이브러리를 지원하여 플랫폼과 독립적으로 thread를 구현할 수 있습니다.

thread 특징

  • thread는 프로세스의 실행 단위에 해당한다
  • 한 프로세스 내에서 동작되는 thread는 메모리를 공유할 수 있다
  • thread는 독립적인 자원을 수행하므로 각자의 스택과 레지스터 값을 가진다

thread마다 스택을 독립적으로 할당하는 이유

독립적인 실행 흐름을 제공하기 위해 최소 조건으로 스택을 독립적으로 할당해야 합니다. 왜냐하면 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소, 함수 내 변수등을 저장하기 위한 메모리 공간으로 사용되기 때문입니다.

thread의 장점

thread는 프로세스보다 생성 및 종료 시간이 짧고 문맥 교환 (context-switching)에 필요한 비용이 적습니다. 특히 thread는 프로세스의 메모리, 자원등을 교환하므로 커널의 도움 없이 (별도의 inter-process communication; IPC) 없이 상호 간의 통신이 가능합니다.

detach()와 join()

  • join 함수는 thread 실행 종료까지 대기합니다
  • detach 함수는 thread 오브젝트에 연결된 thread를 떼어냅니다

detach 이후에는 thread 오브젝트로 thread를 제저할 수 없습니다. 떼어

joinable

joinable 함수를 이용하면 thread join을 호출할 수 있는지 체크할 수 있습니다

sample code (detach)

#include <iostream>
#include <thread>
#include <memory>
#include <chrono>

using namespace std;

class Foo {
public:
    Foo() { cout << __func__ << endl; }
    ~Foo() { cout << __func__ << endl; }
};

class Goo {
public:
    Goo() {
        cout << __func__ << endl;
        foo_ = make_unique<Foo>();
    }
    ~Goo() { cout << __func__ << endl; }

private:
    unique_ptr<Foo> foo_;
};

void print() {
    cout << __func__ << endl;
    unique_ptr<Goo> goo_ = make_unique<Goo>();
    std::this_thread::sleep_for(std::chrono::milliseconds(10000));
}

int main() {
    std::thread t(print);
    t.detach();

    while(1) {
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
    cout << "exit" << endl;
}
반응형

댓글