C++ 멀티 쓰레드(Multi Thread)

Intro

멀티 쓰레드 알아보기

멀티 쓰레드 (Multi Thread)

쓰레드

쓰레드는 프로세스 내에서 실행되는 여러 실행의 흐름이다.

프로세스

프로세스는 메모리에 적재되어 실행중인 프로그램을 의미한다.

프로세스는 최소 1개이상의 쓰레드(메인 쓰레드)를 가지고있고 여러 개의 쓰레드를 가지면 멀티 쓰레드가 된다.

멀티 프로세스

독립된 영역을 가진 다수의 프로세스를 생성하는 멀티 프로세싱의 방식도 있다.

멀티 프로세싱의 단점은 다음 프로세스 상태를 복구하면서 생기는 (Context Switching)의 오버헤드가 발생한다.

데이터 영역, 힙, 스택 영역을 모두 비공유한다(독립적)

멀티 쓰레드의 장점

멀티쓰레드의 장점은 멀티프로세스의 단점을 최소화시켜 메모리를 공유하여 스위칭이 더욱 빠르며 응답시간이 개선되었다.

쓰레드간 스택을 제외한 코드 영역, 데이터 영역, 힙영역을 공유한다(자원 공유, 데이터 교환 가능)

멀티 쓰레드의 단점

여러개의 쓰레드가 동시에 작업을 진행하다 보면 공유된 데이터들의 충돌이 일어날 가능성이있다.

하나의 쓰레드만 실행되면 오히려 작업시간이 지연될 수 있다.

예제

쓰레드 생성

#include <iostream>
#include <mutex> 
#include <thread>
#include <vector>
#include <chrono>
#include <string>

using namespace std;

int main()
{
	const int num_pro = std::thread::hardware_concurrency();

	cout << std::this_thread::get_id() << endl; // main thread ID

	std::thread t1 = std::thread([]()
	{
		cout << std::this_thread::get_id() << endl; // thread t1 ID
	});

	
	t1.join();  // join은 스레드 종료까지 대기하는 함수 대기하지않으면 main 함수에의해 종료된다.
}

메인 프로세스가 가지는 쓰레드 ID 새로 생성한 쓰레드 t1 ID 확인할  있다.

Mutex

#include <iostream>
#include <mutex> 
#include <thread>
#include <vector>
#include <chrono>
#include <string>

using namespace std;

mutex mtx;

int sum = 0;
int counter = 0;

int main()
{

	auto work_func = []()
	{
		for (int i = 0; i < 1000; i++)
		{
			
			mtx.lock();
			sum++;
			cout << std::this_thread::get_id() << " " << sum << endl;
			mtx.unlock();
		}
	};

	std::thread t1 = std::thread(work_func);
	std::thread t2 = std::thread(work_func);

	
	t1.join();
	t2.join();

}

mutex는 상호배제(mutual exclusion)의 약자이며 스레드의 처리시 동시에 접근할 수 없도록 하는 영역을 뜻한다.

lock을 통해 임계구역에 들어갈 권한을 얻고 다른 스레드가 수행중이라면 대기한다.

그리고 unlock을 통해 임계 구역의 사용을 끝냈음을 알린다.

만일 lock을하고 unlock을 하지않는다거나 다음과 같은 여러가지 조건이 겹치게 되면 교착상태(Deadlock)이 발생한다.

상호배제(Mutual exclusion) : 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.

점유대기(Hold and wait) : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.

비선점(No preemption) : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.

순환대기(Circular wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.1

실행 결과

1

댓글남기기