小技巧: 当ACE_Svc_Handler关闭时使用的默认行为
Stone Jiang
上一篇我们看了ACE_Svc_Handler::open()挂勾函数提供默认行为的一些技巧。因为在大多数情况下,它完成了服务创建时所需的所有事情:为输入事件注册新处理器和返回。
在ACE_Svc_Handler中关闭操作的默认行为要比在open()中初始化的代码更为复杂。这是因为关闭时的挂勾函数包含了反应式(reactive)关闭和主动式(active-object)关闭两种情
况,它们有相同的效果:删除所有在反应器注册的事件和确保删除ACE_Svc_handler的派生类的对象。
反应式关闭(handle_close()): 当以下形况发生时被调用:
1) 事件回调函数(译注:handle_xxxx())返回-1时,或
2) 调用ACE_Reactor::remove_handler(),传入的标记不含 DONT_CALL时
反应器框架将调用handle_close()挂勾函数。 ACE_Svc_handler::handle_close()的默认行为是调用ACE_Svc_Handler::destroy()销毁事件处理器。
主动对象式关闭(close()): 当ACE_Svc_Handler 派生的对象通过activate()函数转变为主动对象,处理器的的svc()方法在它产生的线程中运行后进行回调。当svc()返回时,线程
退出,但在它要退出时,仍在将要退出线程的上下文中,ACE_Task框架调用它的close()方法。ACE_Svc_Handler::close()方法调用handle_close()完成服务处理器的清理工作。
因此,不管ACE_Svc_Handler对象是反应式还是主动式,结束时的清理工作都在相同的地方:ACE_Svc_Handler::destroy()。如果对象是动态分配且不是ACE_Stream框架中的组成部
分,destroy()将删除此对象,如果对象不是动态分配的,析构它的责任是创建时对象所在的封闭范围。如果对象是ACE_Stream的模块的组成部分,流和/或控制流的代码负责管理
对象的生命期。destroy()函数应遵守这样的规则来避免出现资源泄漏。
无论ACE_Svc_Handler对象是反应式销毁还是主动式销毁,都会引起相同的事情发生:~ACE_Svc_Handler() (处理器的析构函数)调用ACE_Svc_Handler::shutdown()函数完成服务处
理器的清理工作。shutdown()执行的这些清理操作是:
如果处理器与反应器是关联的:
取消处理器关联的所有定时器。
为处理器的流对象(如socket)删除所有已注册的事件。
如果处理器与再生器(recycler)是关系的,从再生器中清除处理器。
关闭流对象。
因此,我们看到的绝大多数情况服务处理器通过shutdown需要通过框架来清理工作,都是简单的允许缺省的挂勾函数得以被调用。如果你的应用程序需求更多的关闭/清理规则,推
荐的地方是你的处理器的handle_close()挂勾方法。仅仅是确保把ACE_Svc_Handler::destroy()函数人作为你的handle_close()的最后一个动作,与框架清理行为的余下的行为合
并。
分享到:
相关推荐
通常,服务器会创建一个`ACE_Svc_Handler`实例,然后将其注册到ACE的IO复用机制(如`ACE_Reactor`或`ACE_Selector`)中,这样当有新的连接请求时,ACE就会调用相应的处理器方法。 在创建网络服务器的过程中,以下是...
- **close()**: 关闭并释放由`ACE_Reactor`使用的资源。 - **register_handler(ACE_Event_Handler*, ACE_Reactor_Mask)**: 注册事件处理器到`ACE_Reactor`,并指定感兴趣的事件类型。 - **remove_handler(ACE_Event_...
3. `ACE_Svc_Handler`:处理具体的业务逻辑,继承自`ACE_Event_Handler`,实现读写回调函数。 4. `ACE_Thread_Manager`:用于管理线程,确保资源的正确释放。 客户端可能包含以下组件: 1. `ACE_SOCK_Connector`:...
例如,你可能会用到`ACE_MFC::Active_Object`来创建并发执行的任务,或者使用`ACE_MFC::Synch_Svc_Handler`来处理网络连接。同时,还需要关注线程安全、错误处理和性能优化等方面的问题。 总的来说,ACE MFC库为MFC...
class ChatClientHandler : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> { public: int open(u_long flags = 0) { // 初始化 return 0; } int handle_input(ACE_HANDLE handle) { char buffer...
标题中的"ACE.zip_ACE_ACE p_ACE source code"表明这是一个包含ACE库源代码的压缩文件。"ACE p"可能是指"ACE Proactor",它是ACE库的一部分,提供了异步事件处理的能力。"ACE source code"则直接指明了压缩包内的...
9. **动态配置和适应性**: ACE的设计目标之一就是适应性,可以根据运行时的环境变化调整其行为,例如负载均衡、资源管理等。 总的来说,ACE_server.rar 提供了一个基本的网络通信框架,通过学习和扩展这个框架,...
在这里,`HA_MessageReceiver`继承自`ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>`,用于接收并处理来自客户端的`ACE_SOCK_ACCEPTOR`连接。 8. **测试客户端**:客户端可以使用`This->peer().send_n`方法发送...
- **实现类**:`ACE_Event_Handler`,这是一个抽象基类,开发者可以通过继承来自定义事件处理逻辑。 ##### 7. **信号拦截** - **功能**:用于处理操作系统发送给进程的信号。 - **实现类**:`ACE_Sig_Handlers`...
本篇文章将深入探讨如何使用WebSocketpp实现一个自定义的Web服务器,并着重讲解处理客户端的基本请求。 首先,让我们了解WebSocket协议。WebSocket是一种在客户端和服务器之间建立持久连接的协议,允许双向通信。...
总结来说,`set_new_handler`函数为C++程序员提供了对内存分配失败时行为的控制,允许他们在系统资源紧张时采取适当的措施,如释放资源、扩大内存池或优雅地终止程序。理解和熟练使用这个函数,能帮助开发者更好地...
`ACE_Reactor`负责调度事件处理,当有新的连接或数据到达时,它会调用相应`ACE_Handler`的回调函数。 3. `ACE_Acceptor`: ACE提供`ACE_Acceptor`类来接受客户端的连接请求。它会绑定到特定的端口,并在有新连接时...
而当`ACE_Guard`对象被销毁时,它会自动调用锁的`release()`方法。 示例代码如下: ```cpp ACE_Guard<ACE_Thread_Mutex> guard(this->mutex_); ``` 通过这种方式,可以确保即使在异常情况下,锁也能正确地被释放...
使用完`ACE_Message_Block`后,必须调用`release`方法来减少引用计数,当计数为0时,内存会被自动释放。 5. **消息处理**: - **接收端**:通常会创建一个继承自`ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>`...
9. **ACE_Svc_Handler**:服务处理器,通常与Reactor配合使用,处理来自网络的请求。 10. **ACE_Log_Priority** 和 **ACE_DEBUG**:日志记录工具,用于调试和记录程序运行信息。 通过"ace技术内幕示例代码",我们...
《C++网络编程卷2-基于ACE和框架的系统化复用》是深入...通过阅读《C++网络编程卷2-基于ACE和框架的系统化复用》,读者将能够深入了解ACE库的使用,掌握高级的网络编程技巧,并具备构建高效、可扩展的网络应用的能力。
这个压缩包包含的是一组使用ACE_Proactor实现TCP通信的示例代码,我们可以从这些文件中学习到如何在C++中运用ACE库来处理网络通信。 首先,`Tcp.cpp`可能是主程序入口,它可能负责初始化ACE_Proactor,并创建必要的...
7. **ACE_Svc_Handler**:服务处理器基类,通常用于处理特定的网络请求。 8. **ACE_Test_and_Set**:实现了原子的测试并设置操作,用于线程同步。 9. **ACE_Naming_Context**:命名服务接口,用于定位和查找网络...
7. **对象适配器**:ACE的对象适配器如`ACE_Service_Object`和`ACE_Svc_Handler`,帮助管理和调度服务对象,使其能被Reactor正确地激活和关闭。 8. **内存管理**:ACE提供了`ACE_Malloc`和`ACE_TSS`等工具,用于...
例如,你可以创建一个名为message_receiver的类,继承自ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>,用于接收消息。消息会被封装成ACE_Message_Block对象并放入队列。另一个名为message_handler的类,继承自...