거의 알고리즘 일기장

멀티스레드 기본 사용법 (with c++) 본문

c++ 문법

멀티스레드 기본 사용법 (with c++)

건우권 2020. 5. 6. 18:26

 필요성

 요즘에는 cpu하나에 여러개의 코어가 달려있다. 이를 효율적으로 사용하기위해 나온 기법이 멀티스레딩이다.


 멀티스레드란?

 병렬처리 기법중 하나로 cpu안에 있는 여러개의 코어를 이용해서 더욱더 빠른 연산을 하게하는 기법이다. 구조에 대해서는 밑의 그림을 보면 이해가 쉬울것이다.

따배씨++강의의 그림중 하나

  위의 그림을 보면 이미 일을 처리하고 있던 main thread가 다른 스레드에게 일을 나눠주고 받는 형태를 볼수있다. 예를 들면 밑처럼 실행하고 받는다고 생각하면 된다.


사용법 ( 주석에 자세히 설명해둠 )

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

using namespace std;

//서로 못건드리게 함
mutex mtx; //mutual exclusion

int main()
{
	//여러가지 일을 동시에 처리
	//cout이 깨지지않게 실행시키기 위해서 
	//mutex를 이용해 cout을 lock시키고 다 실행되면
	//unlock하는 식으로 이용한다.
	auto work_func = [](const string& name)
	{
		for (int i = 0; i < 5; i++)
		{
			//일을 하는부분
			this_thread::sleep_for(chrono::milliseconds(100));
			
			mtx.lock();
			cout << name << " " << this_thread::get_id() << " is working" << i << endl;
			mtx.unlock();
		}
	};
	
    	//일해라
	thread t1 = thread(work_func, "Jack");
	thread t2 = thread(work_func, "Dash");
	
    	//t1, t2가 일다해서 값줄때 까지 main은 대기
	t1.join();
	t2.join();

	////코어의 개수
	//const int num_pro = thread::hardware_concurrency();

	////main함수를 돌리고있는 thread의 id 출력
	//cout << this_thread::get_id() << endl;

	//thread t1 = thread([]() {
	//	//main함수를 돌리고있는 thread의 id 출력
	//	cout << this_thread::get_id() << endl;
	//	while (true) {}});

	////t1이 끝날때까지 대기
	//t1.join();

	
	return 0;
}

장점과 단점

장점

하나의 메모리 공간을 여러개의 스레드들이 함께 사용할수 있게 해주기 때문에 다른 병렬처리 기법들에 비해서 훨씬 구현하기 편리하다. 

 

단점

하지만, 같은 메모리 공간을 공유할수 있다는 장점은 오류가 생기는 문제점이 될수도 있다. 이러한 경우에 생기는 문제점을 레이스 컨디션이라고 함.

https://kunkunwoo.tistory.com/117

 

멀티스레드의 주의사항! _ 레이스 컨디션

시작하기에 앞서 앞서 쓴 멀트스레딩에 이런 글이 있었다. https://kunkunwoo.tistory.com/116 멀티스레딩 기본 사용법 필요성 요즘에는 cpu하나에 여러개의 코어가 달려있다. 이를 효율적으로 사용하기위해 나온..

kunkunwoo.tistory.com


참고

홍정모의 따배씨++ ( 인프런 )


후기

홍정모의 따배씨++강의는 전설이다.

반응형
Comments