본문 바로가기
프로그래밍/시스템 프로그래밍

쓰레드 생성

by 오늘의논리 2024. 3. 3.
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

'프로그래밍 > 시스템 프로그래밍' 카테고리의 다른 글

SpinLock  (1) 2024.03.05
DeadLock  (0) 2024.03.04
락 기초  (0) 2024.03.04
Atomic  (0) 2024.03.03
멀티 쓰레드  (0) 2024.03.03

댓글