반응형
요즘은 고성능 프로그램을 만들 때 멀티코어를 얼마나 잘 활용하느냐를 중요하게 여깁니다. 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;
}
반응형
'💻 programming > c++' 카테고리의 다른 글
[c++] timer 클래스 만들기 (0) | 2021.08.04 |
---|---|
[c++] thread vs task (thread 와 async) (0) | 2021.08.04 |
[c++] lvalue reference and rvalue reference (0) | 2021.08.04 |
[c++] condition variable (조건 변수) (0) | 2020.12.17 |
[c++] std::shared_mutex (0) | 2020.12.16 |
댓글