2010-01-18 52 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接口適應同步。