贝贝花花包包店,精品555皮具,钱夹,皮夹

字体:  

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

xenium_lee 发表于: 2008-9-24 12:20 来源: ACE 开发者

每个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 at 2008-9-25 10:45:31
我的看法:
1、按ACE的一般使用规则,不是在handle_write_stream中,发现错误,调用delete this,而是在handle_read_stream发现错误时候,删除自己。
2、Proxy机制,的确保证了不出错误。我们都是这样用的。