0

アプリケーションにタイマーを管理するモジュールがあります。このクラスには、基本的に3つの機能があります。

ACE_Reactorのインスタンスは、タイマーを管理するためにモジュールによって内部的に使用されます。

  • タイマーのスケジュール-ACE_Reactor::schedule_timer()を呼び出します。引数の1つは、タイマーの期限切れ時に呼び出されるコールバックです。
  • タイマーのキャンセル-ACE_Reactor::cancel_timer()を呼び出します

実行のプライベートタイマーでreactorが実行されるため、schedule/cancelとtimeoutcallbackは異なるスレッドで実行されます。

ACE_Reactor :: schedule_timer()は、ヒープ割り当て構造(arg引数)を受け取ります。

この構造は、後でタイマーをキャンセルするとき、またはタイムアウトハンドラーが呼び出されるときに削除されます。ただし、キャンセルハンドラとタイムアウトハンドラは異なるスレッドで実行されるため、構造が2回削除される場合があるようです。

タイムアウトハンドラーが呼び出されたときにタイマーがキャンセルされるようにするのはreactorの責任ではありませんか?

4

1 に答える 1

0

私の知る限り、そのようなケースは間違いなく可能ACE_TP_Reactorです。TP-reactor を使用すると、タイムアウトは同じスレッドで同期されません。つまり、他のスレッドで実行中にタイムアウトが発生する可能性があります。handle_inputイベントを同期する必要があります。それを行うためのクリーンな方法は、ACE_Event_Handlerインターフェイスを同期用に適合させることです。

于 2010-01-20T06:40:08.933 に答える