ACE_Svc_Handler的并发性问题

在ACE基于Reactor模式的 Acceptor-Connector 框架中:
当一个新的连接请求到达server时,会触发ACE_Acceptor的handle_input方法。
ACE_Acceptor的handle_input做三件事情:
1、调用make_svc_handle()创建一个新的 service handle。此时会调用该ACE_Svc_Handler的构造函数
2、调用accept_svc_handle(),执行accept
3、调用activate_svc_handle(),调用service handle的open方法。
在accept的时候,系统的accept函数会为每个新连接创建一个socket,然后ACE的模式是一个socket(ACE_HANDLE)对应一个ACE_Svc_Handler。在执行完accept方法后,该ACE_Svc_Handler就被Reactor关联到一个socket(ACE_HANDLE)上。当有新数据到达时,Reactor就会触发这个ACE_Svc_Handler的handle_input方法。
理论来讲一个ACE_Svc_Handler对应一个网络连接,发生并发冲突的情况很小。那么在哪些步骤可能发生并发呢?
1、首先,ACE_Svc_Handler的handle_input/handle_output/handle_close可能在open执行结束之前被调用。ACE在此模式中使用open来初始化一个对象而不是构造函数,是考虑构造函数难以处理创建中发生的各种错误(ACE不喜欢用C++ exception),那么给问题的处理带来很多麻烦。于是就用一个open函数来处理所有的初始化工作。但是,如果handle_input在open执行结束之前被调用,情况是比较可怕的。
2、ACE_Svc_Handler的析构函数可能在open执行结束之前被调用。例如handle_input返回负值的时候就会引发handle_close,而handle_close会调用delete this;删除自己,此时就会调用该对象的析构函数。而此时open正在对一些变量进行初始化,so....
那么,如何处理这些问题呢?对于每个网络连接,在每次数据接收之间经常是有一些状态需要保存的。嗯,尽量多用函数内的局部变量,少定义成员变量,多加锁。唉……

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥