【发布时间】:2013-11-04 01:51:06
【问题描述】:
我在 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 的线索将不胜感激。
谢谢
【问题讨论】:
-
@Len Holgate - 你为什么删除你的答案?它比我的好,(因为我没有正确阅读 OP 问题)。我补充说 refCount 需要自动递减,但基本上,你的答案应该有效。放回去!!
-
当/如果他取消删除它时,请支持 Len Holgate 的回答 - 这比我的要好。
-
马丁,对不起,我删除了,因为我认为我没有阅读过 OP 问题(基于我在您的回答中再次阅读它:))
标签: multithreading sockets iocp