我在 IOCP 服务器上工作(重叠 I/O、4 个线程CreateIoCompletionPort
、、GetQueuedCompletionStatus
等等WSASend
)。我还为每个异步 I/O 操作创建了一个自动重置事件并将句柄放在 OVERLAPPED 结构中。
问题是:如何正确发送缓冲区所有连接的套接字?每个套接字都存储在上下文信息结构的链表中。
我不确定下面的方法是否可以?
...
DWORD WINAPI WorkerThread() { // 1 of 4 workthread
...
GetQueuedCompletionStatus(...);
...
PPER_SOCKET_CONTEXT pTmp1, pTmp2;
pTmp1 = g_pCtxtList; // start of linked list with sockets
EnterCriticalSection(&g_CriticalSection);
while( pTmp1 )
{
pTmp2 = pTmp1->pCtxtBack;
WaitForSingleObject(pTmp1->pIOContext->Overlapped.hEvent,infinite);
// if there is any pending wsasend on this socket,wait to completed, so
// we can post another wsasend using the same overlapped structure
// and buffer
WSASend(pTmp1->Socket,...,&(pTmp1->pIOContext->Overlapped), NULL);
pTmp1 = pTmp2;
}
LeaveCriticalSection(&g_CriticalSection);
...
}
如果另一个线程也尝试同时做同样的工作会发生什么?
在所有线程中使用 GQCS 和等待函数是个好主意吗?
任何关于多线程 iocp 服务器中所有客户端的线索wsasends
将不胜感激。
谢谢