오늘은 thread에 대해 알아보도록 하겠다.
스레드(thread)란 ?
프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 한 개 이상의 스레드가 존재하고, 작업을 수행한다.
일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만,
프로그램 환경에 따라 두개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.
프로세스(Process) 란?
간단하게 말하면 실행 중인 프로그램이라고 할 수 있다.
즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.
프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.
프로세스와 스레드의 차이
우선 가장 큰 차이점으로 메모리 공유여부에 대한 부분이 다르다.
프로세스들은 서로 메모리를 공유하지 않고, 독립적인 메모리 공간을 갖는다.
반면 같은 프로세스내에 스레드 끼리는 스택메모리는 각자 가지고 있지만 그 외의 코드, 데이터, 힙 영역 메모리는 공유한다.
운영체제가 할당해주는 메모리는 아래 그림과 같다.
그로인해 멀티 프로세스 프로그램은 멀티 스레드 프로그램에 비해 메모리도 많이 차지하고 컨텍스트 스위칭시 굉장히 큰 비용이 소모된다.
멀티 스레딩 프로그램을 작성할때 굉장히 조심해서 프로그램을 구현해야 한다.
예를들어, 같은 변수에 쓰레드들이 동시에 접근하여 값을 조작하게되면 우리가 원하지 않는 값이 나올수가 있다.
이부분에 대해서는 다음에 더 자세히 포스트를 작성해야 할 것 같다.
스레드(thread) 사용하기
c++11 버전부터 표준 라이브러리에서 thread를 지원하기 시작했다.
std::thread를 사용하여 OS에 독립적으로 thread를 사용할 수 있다.
오늘은 간단하게 thread를 사용하는 방법에 대해 알아보겠다.
#include <iostream>
#include <thread>
using std::thread;
void func(){ // thread에 넘겨줄 함수
int count = 0;
while(1)
{
std::cout << std::hex << std::this_thread::get_id() <<" hello world! : " << std::dec << ++count << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
thread t1(func); // thread 객체 생성 ! 전달받은 함수를 새로운 스레드에서 실행한다.
thread t2([]{ // 람다함수를 전달 할 수 있다.
int count = 0;
while(1)
{
std::cout << std::hex << std::this_thread::get_id() << " hello world! : " << std::dec << ++count << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
});
t1.join(); // 스레드 t1의 실행이 종료될때까지 메인함수의 종료를 대기시킴
t2.join();
}
위 코드를 참고하여 얘기해보겠다.
우선, std::thread를 사용하기 위해선 c++11 이상 버전이 필요하다.
#include <thread>를 통해 thread 헤더를 추가해줘야한다.
오늘은 간단하게 thread 객체를 생성하는 두가지에 대해서만 알아보자.
thread t1(func); 와 같이 thread 객체를 생성하면서 파라미터로 미리 작성한 함수를 전달해주면, 새로운 스레드에서 해당 함수를 실행하게 된다.
위와 같은 방법도 가능하지만, thread t2를 생성한것 처럼 람다함수를 전달할수도 있다.(Callable은 모두 thread 객체 생성시 전달 가능하다.)
join 함수는 주석에 작성된것 같이 스레드가 실행하고 있는 함수의 종료까지 메인 함수를 대기시키는 함수이다.
메인 함수가 먼저 종료된다면 스레드도 같이 종료되기때문에 스레드 함수가 제대로된 기능을 수행하지 못하고 종료 될 가능성이 있다.
오늘은 간단하게 프로세스와 스레드에 대한 내용 및 차이점을 간단하게 알아보았고,
스레드 객체를 생성하는 방법에 대해 알아보았다.
다음에 멀티 스레드 프로그래밍을 하면서 발생할 수 있는 문제점에 대해 정리해보도록 하겠다.
'Development > C++' 카테고리의 다른 글
[C++] Lock(std::lock_guard, std::unique_lock) (0) | 2022.10.14 |
---|---|
[C++] Mutex (0) | 2022.10.08 |