xenium_lee 发表于 2008-9-24 12:20:57

关于多线程运行Proactor循环中删除Service_Handler的疑问

每个ACE_Handler中都有一个指向Proxy的智能指针,注释是这样的:
The Proxy class acts as a proxy for dispatch of completions
to operations issued for the associated handler. It allows the handler
to be deleted while operations are outstanding. The proxy must be used
to get the ACE_Handler pointer for dispatching, and if it's 0, the
handler is no longer valid and the result should not be dispatched.

ACE_Handler的析构函数会把Proxy中的ACE_Handler指针设会0。
Proactor在分发处理函数时,会先检查Proxy中的ACE_Handler指针,如果为0,则不进行分发。
因为检查的是Proxy,而不是ACE_Hanlder本身,所以上面红色的话是对的。

问题是,这个检查只是在分发的时候进行了一次,如果handle_read_stream已经分发了,并且在调用过程中,
另外一个线程运行handle_write_stream,发现错误,调用delete this,此时handle_read_stream再次运行时,
可能会出现错误吧?

当然这只是可能,我只是不太明白Proxy机制能保证上述问题不会出现吗,希望大家探讨一下。

winston 发表于 2008-9-25 10:45:31

我的看法:
1、按ACE的一般使用规则,不是在handle_write_stream中,发现错误,调用delete this,而是在handle_read_stream发现错误时候,删除自己。
2、Proxy机制,的确保证了不出错误。我们都是这样用的。

wesom 发表于 2011-3-31 17:02:53

mark下,
多线程环境中,对同一个socket,A线程处理读事件(handle_read_stream),B线程处理写事件(handle_write_stream),此时A使用delete this,而B正在操作this,肯定会有问题
Proxy机制应该是没用的,因为写事件已经dispatch出来了,这个问题我也很疑虑,望各位高手指点

wesom 发表于 2011-3-31 17:14:45

delete的时机应该是在所有待决的操作完成之后,参考书上的一句话,
追踪未完成I/O请求的数目、并在销毁处理器之前等待它们全部完成,常常是一个好主意。

冬瓜 发表于 2013-10-11 10:11:45

这个问题有答案了?

freeeyes 发表于 2013-10-28 09:04:53

这个纯属使用方法的问题,你的ACE_Service_Handler(以Linux为例)对象在多线程下的维护,必须自己去做。
准确的说,如果你在多线程下使用ACE_Service_Handler对象,那么你必须自己使用引用计数器,或者用一个智能指针去控制。
当你的线程在使用中,但是其他线程想释放的时候,计数器-1,当当前使用线程运行完成后发现计数器为0,则自动释放之,完成回收。
页: [1]
查看完整版本: 关于多线程运行Proactor循环中删除Service_Handler的疑问