728x90
int main()
{
//SystemCall (OS 커널 요청)
cout << "Hello World" << endl;
return 0;
}
이코드는 단순하게 보일 지 몰라도 모니터에 출력을 요청하는것은 systemCall 이라고 해서 운영체제 에게 요청하는 것이다. 쓰레드 생성도 운영체제에게 요청해야한다.
운영체제에게 요청하는 함수는 Window냐 Linux냐 등등에 따라 다르다.
Window 같은경우 <windows.h>를 추가 시켜 CreateThread() 함수를 호출해 주면된다.
하지만 이렇게 되면 Linux 환경이 되면 다시 바꿔줘야 하는 경우가 생긴다. 그래서
VS11버전 이후로는 #include <thread>를 이용해 다양한 환경에서 공용적인 코드로 작성할 수 있다.
#include "pch.h"
#include <iostream>
#include <thread>
void HelloThread()
{
cout << "Hello Thread" << endl;
}
int main()
{
std::thread t(HelloThread); // 새로운 쓰레드를 생성하고 HelloThread 함수를 실행 후 종료된다.
return 0;
}
이걸 만약에 메인함수에서 HelloThread() 이걸 그대로 사용했다고 한다면 메인 쓰레드는 함수를 호출 하고 그대로 내려가 종료되는 반면 위 코드 같은 경우에는 메인 쓰레드는 그냥 내려가고 새로생성된 쓰레드가 HelloThread함수를 실행하는 것이 된다.
#include <iostream>
#include <thread>
void HelloThread()
{
cout << "Hello Thread" << endl;
}
int main()
{
std::thread t(HelloThread); // 새로운 쓰레드를 생성하고 HelloThread 함수를 실행 후 종료된다.
cout << "Hello Main" << endl; // 여기까지만 실행하면 메인쓰레드가 종료되기때문에 문제발생
int32 count = t.hardware_concurrency();// 현재 시스템에서 동시에 실행할 수 있는 하드웨어 스레드 수를 반환, 정확X
t.get_id(); //해당 스레드의 고유식별자를 반환, 순차적으로 올라가지는 않음
t.detach(); //해당 스레드를 메인스레드와 독립적으로 실행하도록 만듬(연결고리를 끊어줌)
t.joinable(); //해당 스레드가 실행 중인 활성 스레드인지 확인한다.
t.join(); // 쓰레드가 끝날때까지 기다려 주는 상태를 만드는 코드, 해당 스레드가 실행을 완료할 때까지 현재 스레드를 차단
return 0;
}
쓰레드의 주요 함수들을 작성해 보았다.
자 다음으로 HelloThread의 매개변수가 있다면 어떨까?
void HelloThread2(int _num)
{
cout << _num << endl;
}
int main()
{
std::thread t(HelloThread2, 10); // 쉼표와 매개변수를 넣어주면 된다.
return 0;
}
쓰레드 또한 객체로 이루어 져 있어 벡터로 관리 할 수 있다.
#include <iostrem>
#include <thread>
void HelloThread2(int _num)
{
cout << _num << endl;
}
int main()
{
vector<std::thread> v;
for (int i = 0; i < 10; i++)
{
v.push_back(std::thread(HelloThread2, i)); //쓰레드 10개 생성
}
for (int i = 0; i < 10; ++i) //쓰레드 10개가 끝나기 전까지는 Main쓰레드를 종료시키지 않음
{
if (v[i].joinable())
v[i].join();
}
cout << "HelloMain" << endl;
return 0;
}
다만 이렇게 실행하면
이런식으로 출력이되는데 쓰레드 10개를 실행하면 걔네들이 병렬로 실행되기때문에 누가 먼저 출력되는지 예상할 수 없을 뿐더러 멀티쓰레드환경에서 정확하게 우리가 예상한대로 하나가 실행되고 그다음에실행되고 가 아니기 때문에 이렇게 출력된다.
728x90
댓글