我的主线程创建了多个I/O工作线程。然后,我通过执行以下操作从主线程发起I/O请求:
{
...
IoRequest *pIoRequest = new IoRequest(m_socket);
pIoRequest->SetBuffer(vecCommandData); // vector of BYTEs
pIoRequest->SetOperationType(OP_TYPE_SEND);
WSASend(m_socket, pIoRequest->GetWsaBuffer(), 1, NULL, 0, pIoRequest, NULL);
...
}
在我的I/O工作线程之一的某个时刻,请求已完成,并且IoRequest对象的缓冲区中填充了有效的响应数据。
DWORD WINAPI WorkerThreadProc(LPVOID lpParameter)
{
IoCompletionPort *pIocp = reinterpret_cast<IoCompletionPort*>(lpParameter);
...
while (true)
{
BOOL bReturn = pIocp->GetStatus(&ulCompletionKey, &dwNumberOfBytesTransferred, (LPOVERLAPPED*)&pIoRequest);
...
switch (pIoRequest->GetOperationType())
{
...
case OP_TYPE_RECEIVE_DATA:
{
...
// the requested I/O operation has completed and pIoRequest's buffer now contains valid response data!
break;
}
...
}
}
return 0;
}
在调用WSASend()之后如何将主线程置于可警告的等待状态,并使其在准备就绪时接收响应数据?
最佳答案
在IOCP服务器中,通常为GetQueuedCompletionStatus()。