class ThreadManager
{
// ...
void Launch(function<void(void)> callback); // Launch에 callback으로 thread함수 등록
void Join(); // Join으로 Launch된 Thread 실행
// ...
// GameServer.cpp
// ...
// CoreGlobal에 ThreadManager가 포함되어있고
CoreGlobal Core;
void ThreadMain()
{
while (true)
{
cout << "Hello ! I am thread... " << LThreadId << endl;
this_thread::sleep_for(1s);
}
}
int main()
{
for (int32 i = 0; i < 5; i++)
{
// Thread에 function을 추가하면 된다.
GThreadManager->Launch(ThreadMain);
}
GThreadManager->Join();
}
// CoreGlobal.cpp
// ...
ThreadManager* GThreadManager = nullptr;
CoreGlobal::CoreGlobal()
{
GThreadManager = new ThreadManager();
}
ThreadManager의 동작은
// ...
void ThreadManager::Launch(function<void(void)> callback)
{
LockGuard guard(_lock);
_threads.push_back(thread([=]()
{
InitTLS();
callback();
DestroyTLS(); // DestryoTLS는 미구현(아직은 필요없다)
}));
}
void ThreadManager::Join()
{
for (thread& t : _threads)
{
if (t.joinable())
t.join();
}
_threads.clear();
}
void ThreadManager::InitTLS()
{
static Atomic<uint32> SThreadId = 1;
LThreadId = SThreadId.fetch_add(1);
// LThreadId는
// thread_local uint32 LThreadId = 0;
// TLS로 선언되어 있고 ID값을 보관하게 된다.
}
// ...