🧼C, C++/라이브러리 강좌(옛날자료)

멀티쓰레딩 <C++ thread>

Mawile 2020. 10. 8.
728x90

시작하기 앞서서 사용한 운영체제는 Windows10이며

IDE는 DevCpp이고 사용한언어는 C++11입니다!


안녕하세요! 멀티쓰레딩관련 첫 번째 글이네요!

먼저 멀 티쓰 레딩 시리즈는 thread->atomic->mutex->chrono->p_thread

이순으로 갈 겁니다!

스레드는 보통 프로그램의 계산속도를 높이고 싶거나,

여러 개의 작업을 병렬로 실행하고 싶을 때 사용합니다!

그럼 바로 시작하겠습니다!


< thread >

먼저 기본적으로 스레드 자료형은 이렇게 선언합니다!

#include <iostream>
#include <thread> //thread
using namespace std;

int main(){
	thread thr(); //thr는 쓰레드자료형의 이름을 선언한겁니다
}

 

그러면 먼저 join함수에 대해서 알아보겠습니다~~

#include <iostream>
#include <thread>
using namespace std;

int main(){
	thread thr();
    
	thr.join(); //기다릴거야!
}

join이 무슨 의미냐면 함수를 바로 끝내지 말고 thr(n) 이렇게 선언했을 때

n함수가 끝낼 때까지 기다린다는 의미입니다!

그러면 한번 함수를 만들어보겠습니다!

#include <iostream>
#include <thread>
using namespace std;
int s=0;

void test(){
	for(int i=0;i<100;i++) s++;
}

int main(){
	thread thr(test);
	for(int i=0;i<100;i++) s++;
	thr.join();
	printf("%d", s);
}

결괏값은 200이나 옵니다

그러면은 다음은 포인터로 전달해보겠습니다!

#include <iostream>
#include <thread>
using namespace std;

void test(int &z){
	for(int i=0;i<100;i++) z++;
}

int main(){
	int s=0;
	thread thr(test,ref(s));
    //ref(s) <-포인터사용o
    //s <= 포인터사용x
	for(int i=0;i<100;i++) s++;
	thr.join();
	printf("%d", s);
}

 정상적으로 잘 나옵니다!

그러면 다음은 detach() 함수에 대해서 알아보겠습니다!

include <iostream>
#include <thread>
using namespace std;

void test(int &z){
	for(int i=0;i<100;i++) z++;
}

int main(){
	int s=0;
	thread thr(test,ref(s));
	thr.detach(); //난 안기다리는함수야~
	for(int i=0;i<100;i++) s++;
	printf("%d", s);
}

detach는 join과 다르게 join은 기다려주고 detach를 쓴다면 이제 완전히 별개의 스레드가 되는 겁니다!

한마디로 완전히 따로 동작하는 겁니다!


자 그러면은 멀티스레드 작업 도중

바뀌는 값이 필요하다면, 어떻게 해야 할까요?

이때는 atomic이 필요한데 다음 시간에 알아보도록 하겠습니다

감사합니다!

 

728x90

댓글