thread 생성 하면서 TLS 초기화를 해주는 스레드 메니저 클래스이고
대단한 기능이 있는건 아니고 관리적인 측면의 클래스라 보면 됩니다
tls 는 이글을 참고하면 됩니다
https://3dmpengines.tistory.com/2206?category=511467
#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;
}
실행 결과
스레드 특성상 글자가 엇나가는 것처럼 보이는건 감안하고 보면 되겠습니다
반응형
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
std::this_thread::yield 스케줄러에게 지연 힌트를 줌 (0) | 2022.09.28 |
---|---|
제프리 리처의 유저모드 동기화들 (0) | 2022.09.28 |
Lock-Free Queue (0) | 2022.09.26 |
atomic 가시성, 원자성 (0) | 2022.09.24 |
lock-free stack (3) : reference count 로 구현 (0) | 2022.09.24 |