找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 8159|回复: 5

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

[复制链接]
发表于 2008-9-24 12:20:57 | 显示全部楼层 |阅读模式
每个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机制能保证上述问题不会出现吗,希望大家探讨一下。
发表于 2008-9-25 10:45:31 | 显示全部楼层
我的看法:
1、按ACE的一般使用规则,不是在handle_write_stream中,发现错误,调用delete this,而是在handle_read_stream发现错误时候,删除自己。
2、Proxy机制,的确保证了不出错误。我们都是这样用的。
发表于 2011-3-31 17:02:53 | 显示全部楼层
mark下,
多线程环境中,对同一个socket,A线程处理读事件(handle_read_stream),B线程处理写事件(handle_write_stream),此时A使用delete this,而B正在操作this,肯定会有问题
Proxy机制应该是没用的,因为写事件已经dispatch出来了,这个问题我也很疑虑,望各位高手指点
发表于 2011-3-31 17:14:45 | 显示全部楼层
delete的时机应该是在所有待决的操作完成之后,参考书上的一句话,
追踪未完成I/O请求的数目、并在销毁处理器之前等待它们全部完成,常常是一个好主意。
发表于 2013-10-11 10:11:45 | 显示全部楼层
这个问题有答案了?
发表于 2013-10-28 09:04:53 | 显示全部楼层
这个纯属使用方法的问题,你的ACE_Service_Handler(以Linux为例)对象在多线程下的维护,必须自己去做。
准确的说,如果你在多线程下使用ACE_Service_Handler对象,那么你必须自己使用引用计数器,或者用一个智能指针去控制。
当你的线程在使用中,但是其他线程想释放的时候,计数器-1,当当前使用线程运行完成后发现计数器为0,则自动释放之,完成回收。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-26 07:11 , Processed in 0.023885 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表