我的主线程创建多个I/O工作线程。然后我做启动从我的主线程的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);
...
}
在某一点上,该请求已完成,我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(后),并使其接收响应数据时,它准备好了?
您的主线程还存在其他什么限制(例如,您是否需要在等待时泵送消息,是否可以阻止,直到工人准备就绪等)? – 2012-08-06 12:07:30
@Nate Kohl-这是我希望我的主线程工作的方式;如果已经有一个I/O请求正在处理,那么我的主线程只是将任何进一步的请求放入一个队列(而不是被阻塞)。无论何时当前的请求正在完成,我的主线程将一个挂起的请求出队并使用WSASend()发送它。作为测试,我打电话while(1){Sleep(1000); }现在WSASend()立即返回。 – jpen 2012-08-06 13:37:21