thread 생성 하면서 TLS 초기화를 해주는 스레드 메니저 클래스이고

대단한 기능이 있는건 아니고 관리적인 측면의 클래스라 보면 됩니다

 

 

tls 는 이글을 참고하면 됩니다

https://3dmpengines.tistory.com/2206?category=511467 

 

TLS(Thread Local Storage) : thread_local

쓰레드를 잘 배분한다 했어도 작업에 따라 한곳으로 요청이 몰릴 수가 있는데 Headp, Data 영역은 쓰레드들 끼리 공유해서 사용하게 되어 lock 등으로 제어를 해줘야 한다 TLS 라는게 스택과 (Heap,Data

3dmpengines.tistory.com

 

#include <thread>
#include <functional>

class Threadmanager
{

public :

	Threadmanager();
	~Threadmanager();


	void launch(function<void(void)> callback);
	void Join();

	static void InitTLS();
	static void DestroyTLS();


private :
	mutex _lock;
	vector<thread> _threads;
};

 

 

 

#include "pch.h"
#include "Threadmanager.h"

Threadmanager::Threadmanager()
{
	//main 함수에 대한 thread id 에 해당
	InitTLS();
}

Threadmanager::~Threadmanager()
{
	Join();
}

void Threadmanager::launch(function<void(void)> callback)
{
	lock_guard<mutex> guard(_lock);

	_threads.push_back( thread ( [=]() 
	{
		InitTLS();		//새로 생성된 thread id 에 해당
		callback();
		DestroyTLS();
	})
	);

}

void Threadmanager::Join()
{
	for (thread& t : _threads)
	{
		if (t.joinable())
		{
			t.join();
		}
	}
}

void Threadmanager::InitTLS()
{
	static atomic<uint32> SThreadId = 1;
	LThreadId = SThreadId.fetch_add(1);

}

void Threadmanager::DestroyTLS()
{
	//동적으로 생성된게 있다면 여기서 삭제 처리 함
}

 

 

 

 

 

Threadmanager* GThreadManager = nullptr;

CoreGlobal::CoreGlobal()
{
	GThreadManager = new Threadmanager;
}

CoreGlobal::~CoreGlobal()
{
	delete GThreadManager;
}

스레드 메니저의 생성은 global 변수로 생성 해놓고 CoreGlobal 클래스를 전역으로 생성하면 CoreGlobal 클래스의 생성자에 의해서 연달아 메니저가 순서를 고려하여 생성하도록 만든 것으로 이역시 자주 볼 수 있는 구조입니다

 

 

 

 

 

실행 코드

CoreGlobal core;



void threadMain() {
	while (true)
	{
		cout << "Thread ID : " << LThreadId << endl;
		this_thread::sleep_for(1s);
	}
}



int main()
{

	for (int32 i = 0; i < 5; ++i)
	{
		GThreadManager->launch(threadMain);
	}
	

	GThreadManager->Join();

	return 0;
}

 

 

실행 결과

 

 

스레드 특성상 글자가 엇나가는 것처럼 보이는건 감안하고 보면 되겠습니다

 

 

반응형

+ Recent posts