2010-01-18 54 views
0

我有一个模块,管理我的应用程序中的计时器。该类基本上具有三个功能:ACE reactor timer管理线程安全吗?

ACE_Reactor的实例由模块在内部用于管理定时器。

  • 调度计时器 - 调用ACE_Reactor :: schedule_timer()。 其中一个参数是一个回调函数,在定时器超时时调用。
  • 取消计时器 - 调用ACE_Reactor :: cancel_timer()

在执行的私人计时器执行的反应器,从而调度/取消和超时回调在不同线程上执行。

ACE_Reactor::schedule_timer()收到一个堆allocatec结构(参数参数)。

当取消定时器或调用超时处理程序时,此结构后来被删除。 但是由于取消和超时处理程序是在不同的线程中执行的,它看起来像是结构被删除两次的情况。

当调用超时处理程序时,确保定时器被取消不是reactor的责任吗?

+0

你检查'cancel_timer'的结果吗?这也有助于获得有关管理删除堆分配结构的方式的更多信息。它是否在处理程序的'handle_close'方法中被删除? – 2010-01-18 21:48:41

回答

0

AFAIK这样的情况绝对有可能与ACE_TP_Reactor。使用TP电抗器,超时在同一个线程上不同步。即一个超时可能发生在某个其他线程正在执行handle_input的过程中。你将不得不同步事件。一个干净的方法是使ACE_Event_Handler接口适应同步。