Reactor::remove_handler的疑问?

allen_zhaozhencn 2005-07-06 11:57:58
有一个反应堆事件检测,多路分离,分派的线程.A.
另有一个线程B. 现有一个ACE_Connector的对象,假设其指针p指向它 (在堆中分配),并已经注册到A线程的运行的reactor中. 如果在B线程调用p->close( )来关闭该连接器.会不会出现多线程方面的问题, 我看了一下close的实现代码. 大致如下:


SVC_HANDLER *svc_handler = 0;

// Make sure that we haven't already initialized the Svc_Handler.
if (this->svc_handler_)
{
// Exclusive access to the Reactor.
ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->reactor ()->lock (), 0);

// Double check.
if (this->svc_handler_)
{
// Remember the Svc_Handler.
svc_handler = this->svc_handler_;

// Remove from Reactor.
this->reactor ()->remove_handler
(this->svc_handler_->get_handle (),
ACE_Event_Handler::ALL_EVENTS_MASK);
//将触发handle_close,在handle_close中delete this; 问题是,这个是通过B线程调用的,而此时如果A正分派一个连接完成事件到handle_output挂钩函数(异步连接方式),会不会出现问题, 如何解决? (当然,动态分配的连接器对象可以在反应堆关闭时由反应堆释放空间. ), 是不是remove_handler函数都只能在reactor运行的线程中调用?


// Cancel timer.
this->reactor ()->cancel_timer
(this->timer_id (), 0, 0);

// Remove this handle from the set of non-blocking handles
// in the Connector.
this->connector_.non_blocking_handles ().clr_bit
(this->svc_handler_->get_handle ());

// We are done. Don't initialize the Svc_Handler again.
this->svc_handler_ = 0;
}
}

...全文
277 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen_zhaozhencn 2005-07-07
  • 打赏
  • 举报
回复
一个程序的反应堆个数可以根据程序的要求来设置.

我的分析如下:在反应堆运行的外部线程中,如要删除一个与反应堆挂钩的事件处理器(remove_handler),应该向反应堆发出一个notify. 由反应堆自身完成这一工作
hxzb7215191 2005-07-06
  • 打赏
  • 举报
回复
一个程序里只有一个反应堆吧.

不过可能两个线程,会有冲突.

你对同一个反应堆对象处理,可能不太好.

gz
allen_zhaozhencn 2005-07-06
  • 打赏
  • 举报
回复
介绍几个ace高手认识一下阿. 肥水不留外人田.
newbiestar 2005-07-06
  • 打赏
  • 举报
回复
哦,原来也是堂里面的,这样吧分数就我们自己内部消化吧……
allen_zhaozhencn 2005-07-06
  • 打赏
  • 举报
回复
是滴.最近少上QQ阿.
laomai 2005-07-06
  • 打赏
  • 举报
回复
晕,才发现楼主也是饼子堂的,你直接在q里喊我不就得了?呵呵
allen_zhaozhencn 2005-07-06
  • 打赏
  • 举报
回复
其实我也是这么想的.由A线程来负责p的close.

谢老慢.
newbiestar 2005-07-06
  • 打赏
  • 举报
回复
别听楼上那头...的话,今天那几个高人都不在……还有,他总是骗人到非技术去揭帖……
laomai 2005-07-06
  • 打赏
  • 举报
回复
刚才问了另一个朋友,他的回答如下:
嗯,一般不会直接在B这里close,通常都系在B做监控,然后通过消息通知A,让A去进行close

如果还有问题,建议你给我发短消息,我给你找几个搞ACE的人来.呵呵
ps.如果结贴的时候想给偶分的话,请先把帖子转到非技术区,呵呵
allen_zhaozhencn 2005-07-06
  • 打赏
  • 举报
回复
谢谢楼上两位同志 :)
zhouhuahai 2005-07-06
  • 打赏
  • 举报
回复
顶一个
laomai 2005-07-06
  • 打赏
  • 举报
回复
帮你顶,呵呵

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧