设为首页收藏本站

ACE开发者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1894|回复: 3

关于多线程运行Proactor循环中删除Service_Handler的疑问 [复制链接]

Rank: 2

发表于 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机制能保证上述问题不会出现吗,希望大家探讨一下。

Rank: 9Rank: 9Rank: 9

发表于 2008-9-25 10:45:31 |显示全部楼层
我的看法:
1、按ACE的一般使用规则,不是在handle_write_stream中,发现错误,调用delete this,而是在handle_read_stream发现错误时候,删除自己。
2、Proxy机制,的确保证了不出错误。我们都是这样用的。
www.acejoy.com
ACE网络编程开发
神说:学好ACE,要看书。。。

使用道具 举报

Rank: 3Rank: 3

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

使用道具 举报

Rank: 3Rank: 3

发表于 2011-3-31 17:14:45 |显示全部楼层
delete的时机应该是在所有待决的操作完成之后,参考书上的一句话,
追踪未完成I/O请求的数目、并在销毁处理器之前等待它们全部完成,常常是一个好主意。

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

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

GMT+8, 2012-5-22 15:42 , Processed in 0.024541 second(s), 9 queries , Xcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部