(C++ : IOCP-11) ThreadManager

Posted by : at

Category : Cpp   iocp



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값을 보관하게 된다.
}

// ...

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links