Worker Thread 개수 권장 기준
SYSTEM_INFO si;
GetSystemInfo(&si);
int workerCount = si.dwNumberOfProcessors * 2;
Worker Thread 다중 생성
std::vector<HANDLE> g_workerThreads;
for (int i = 0; i < workerCount; i++)
{
HANDLE hThread = CreateThread(
NULL,
0,
WorkerThread,
NULL,
0,
NULL
);
g_workerThreads.push_back(hThread);
}
종료용 Completion Packet 전송
for (int i = 0; i < workerCount; i++)
{
PostQueuedCompletionStatus(
g_hIOCP,
0,
IOCP_EXIT_KEY,
NULL
);
}
Worker Thread 종료 처리
DWORD WINAPI WorkerThread(LPVOID)
{
while (true)
{
DWORD bytes;
ULONG_PTR key;
OVERLAPPED* ov;
GetQueuedCompletionStatus(
g_hIOCP,
&bytes,
&key,
&ov,
INFINITE
);
if (key == IOCP_EXIT_KEY)
{
break; // 정상 종료
}
ClientContext* ctx = (ClientContext*)key;
if (bytes == 0)
{
closesocket(ctx->socket);
delete ctx;
continue;
}
// recv 처리...
}
return 0;
}