`
iunknown
  • 浏览: 407977 次
社区版块
存档分类
最新评论

IOCP 的资源释放问题

阅读更多
在参考了一些资料,并且尝试了几次之后,也逐渐想到了一个用来安全释放 IOCP 资源的办法。
http://groups.google.com/group/dev4server/browse_thread/thread/29a91064931a628e

接着发现有人已经把这种方案描述的很清楚了
http://blog.codingnow.com/2007/07/robust.html#comment-12142

对大家的讨论不置可否,但是使用ID代替指针确实在某些方面是有益处的。
而某些时候我们无法使用智能指针。举个例子,完成端口中

GetQueuedCompletionStatus(
*pTHIS,
&dwNumberBytes,
(PULONG_PTR)&lpKey,
&lpEvent,
INFINITE
);


其中的lpKey是一个非常关键的变量,我们一般把它置为一个对象的指针。这样我们就可以通过这个指针去访问该对象。

但是事实上很多时候这个指针的生命周期是不固定的,而由于其传入的是PULONG_PTR类型的值,我们又不能直接使用智能指针。要么就要繁琐的执行addref 和 release 这样的操作而完全丢失智能指针的优越性。

可是,如果这里传入的是一个ID或者HANDLE,为其对象的访问增加一层间接性。那么我们就可以预防非法的指针访问,从而达到安全的生命周期管理。
分享到:
评论
2 楼 iunknown 2008-05-12  
之前一直困扰在如何等待所有这些异步 IO 操作完成(包括被取消),现在想到了一个办法。
IOCP 的内部实现是遵循 FIFO 的,在 closesocket 之后,不要立即 free ,而是重新
PostQueuedCompletionStatus 一个完成特殊事件给 GQCS ,通过 GQCS 得到这个事件,接着在进行 free 。

这样就相当于变相地等待所有这些异步 IO 完成了。
因为 closesocket 之后,所有 IO 都会被取消,这些取消的操作将在 GQCS 的队列中等待被处理,
而用 PostQueuedCompletionStatus 投递的特殊事件,应该排在这些被取消的操作之后。
1 楼 iunknown 2008-05-11  
使用 BoundsChecker 进行了检查,报了下面的这种错误。
从描述来看,应该是某段内存被释放之后,接着这段内存继续被程序进行了修改。

引用

OutDbStr: HEAP[testiocpecho.exe]:
OutDbStr: HEAP: Free Heap block 123c1a0 modified at 123c1d4 after it was freed
OutDbStr: HEAP[testiocpecho.exe]:
OutDbStr: HEAP: Free Heap block 1680040 modified at 1680074 after it was freed
OutDbStr: Heap corruption detected at 0123C1A8
OutDbStr: HEAP[testiocpecho.exe]:
OutDbStr: HEAP: Free Heap block 123c1a0 modified at 123c1d4 after it was freed


http://msdn.microsoft.com/en-us/library/ms737582(VS.85).aspx

引用

An application should not assume that any outstanding I/O operations on a socket will all be guaranteed to completed when closesocket returns. The closesocket function will initiate cancellation on the outstanding I/O operations, but that does not mean that an application will receive I/O completion for these I/O operations by the time the closesocket function returns. Thus, an application should not cleanup any resources (WSAOVERLAPPED structures, for example) referenced by the outstanding I/O requests until the I/O requests are indeed completed.



从上面这段描述来看, IOCP 在内部是这样处理的:
在 WSASend 和 WSARecv 发出一个异步请求之后,如果一直都没有完成,直到 closesocket 引发这些操作被取消,在取消的过程中,IOCP 会对 OVERLAPPED 进行一些写操作。但是 IOCP 又没有提供一种等待这些操作完成的机制。那应该如何来处理这种情况呢?

一种可能的办法是在 closesocket 之后,不要立即释放 OVERLAPPED ,重新 POST 一个 CompletionStats 到 CompletionPort ,通过 GQCS 再次得到这个 OVERLAPPED ,然后释放?期望 GQCS 内部是 FIFO 的?被取消的 IO 操作,比重新 POST 的 CompletionStats 更早发生,因此会被先处理?

相关推荐

    IOCP测试(内存泄露问题)

    4. **并发编程**:在多线程环境下,尤其是在IOCP模型下,需要特别注意线程安全,确保对共享资源的访问是同步的,避免竞态条件导致的内存问题。 5. **调试技巧**:使用调试工具如Visual Studio的调试器,或者内存...

    VC的IOCP开发,iocp类,demo

    - 错误处理和资源释放 通过阅读和分析"IOCPDemo"的源代码,我们可以学习到如何在实际项目中应用IOCP,以及如何解决可能遇到的问题,比如线程调度、内存管理、错误处理等。 总结来说,IOCP是构建高性能网络服务器的...

    IOCP文件客户端 IOCP文件客户端

    例如,当连接失败或数据传输过程中出现错误时,客户端应能正确地关闭连接并释放资源。同时,为了防止内存泄漏,必须确保分配的内存得到释放,而缓冲区的大小则需要根据文件大小和网络带宽来合理设置。 总之,“IOCP...

    高效率IOCP的UDP通信服务端

    6. **错误处理和资源释放**: 在适当的时候关闭套接字,释放IOCP,并清理线程池。 通过这种方式,我们可以构建一个高效率的UDP通信服务端,它能够处理大量的并发连接,同时保持低延迟和高吞吐量。在实际应用中,还...

    C# IOCP完整代码和演示

    4. **错误处理**:DEMO还会包含对I/O操作失败的处理,比如异常捕获和资源释放。 5. **循环接收**:服务器通常会在一个无限循环中等待新的I/O完成,以便持续服务客户端请求。 6. **关闭和清理**:最后,需要正确...

    windows IOCP示例代码

    6. **释放资源**:在完成所有操作后,关闭IOCP句柄,释放相关资源。 在`IOCPTest`这个项目中,我们可以看到相关的代码实现。通常,会有一个主线程负责接收新的客户端连接,然后为每个连接创建一个新的套接字,并将...

    IOCP.NET(强大的IOCP托管库)

    为了更好地监控和调试IOCP.NET应用,可以利用.NET框架提供的性能计数器(Performance Counter)以及日志记录工具,收集服务器的运行状态数据,如并发连接数、I/O操作次数、错误发生频率等,以便进行性能分析和问题...

    iocp客户端库

    5. **错误处理与关闭**: 监听IOCP中的错误事件,当发生错误时,关闭相关资源,释放IOCP。 6. **资源回收**: 应用程序退出时,正确关闭IOCP,释放所有相关资源。 **四、IOCP客户端库的优化点** 1. **线程池管理**:...

    易语言IOCP线程池源码

    7. **关闭和清理**:在程序退出时,需要关闭IOCP,释放所有资源,并确保所有工作线程安全退出。 在`content.txt`文件中,可能包含了易语言实现的IOCP线程池的具体代码,包括如何创建和管理线程池,以及如何利用IOCP...

    IOCP代码完美代码

    在程序退出或资源清理阶段,确保正确地释放所有资源至关重要。 综上所述,IOCP代码示例为我们展示了如何在Delphi中构建一个高并发、低延迟的网络服务器。通过理解和实践这个示例,开发者可以更好地掌握异步I/O编程...

    c++版IOCP完成端口源码

    本文将深入探讨C++实现的IOCP完成端口源码,以及它如何处理TCP和UDP协议,同时解决掉线、死机和超时问题。 首先,理解IOCP的核心概念至关重要。IOCP是一种异步I/O模型,它允许多个线程共享一个I/O端口来处理来自多...

    IOCP.rar_IOCP_io_iocp vc_vc iocp

    5. **关闭IOCP**:在应用程序结束时,记得调用`CloseHandle`关闭IOCP,释放相关资源。 通过这个压缩包中的资源,你可以深入学习IOCP的工作原理,了解如何在VC++项目中设置和使用IOCP,以及如何优化代码以最大化性能...

    把完成端口IOCP封装成DLL.zip

    回调函数可能需要更新数据结构,释放资源,或者通知应用程序。 5. **关闭和清理**:DLL应提供一个接口供用户关闭IOCP和清理资源。关闭IOCP时,需要确保所有工作线程已退出,然后调用`CloseHandle`函数。 在...

    IOCP的socket通讯程序示例代码

    7. 关闭资源:在程序结束时,正确关闭Socket和IOCP,释放资源。 六、总结 通过“SocketDemo”项目,我们可以学习如何在实际开发中运用IOCP来优化Socket通信。IOCP机制使得服务器能够高效地处理大量并发连接,提高了...

    IOCP高性能服务器

    6. **关闭资源**:在服务器关闭时,我们需要释放所有资源,包括关闭Socket、取消未完成的I/O操作和关闭IOCP。 在给定的文件中,`winsock2.pas`包含了Winsock库的相关接口,它是实现Socket通信的基础。而`IOCPSocket...

    IOCP 服务器

    7. 释放资源:在服务器关闭时,需要解除所有套接字与IOCP的关联,并关闭IOCP。 在CIOCPServer项目中,可能包含了实现IOCP服务器的源代码。这个服务器能够高效地处理网络连接,尤其适合需要处理大量并发请求的场景,...

    IOCPServer异步接受

    - **资源释放**:当不再需要IOCP时,记得调用`CloseHandle`关闭它,同时清理相关的套接字和线程资源。 通过上述步骤,我们可以构建一个基于IOCP的异步TCP服务器,实现高效、低延迟的连接接受。这种技术广泛应用于...

    IOCP测试,客户端连接量达到15000没有问题。

    - 资源管理:正确地释放I/O请求相关的资源,避免内存泄漏。 - 高效的数据处理:尽量减少不必要的数据拷贝,例如通过重用缓冲区或使用零拷贝技术。 总之,IOCP是实现高并发服务器的关键技术之一,它允许服务器优雅地...

Global site tag (gtag.js) - Google Analytics