Reactor は IO など、複数のイベントをひとつのスレッドで待って処理するプログラムのためのパターンです。詳細は書籍『プログラムデザインのためのパターン言語』などに載っています。
ここでは、実際に Reactor パターンを使ってみたときの技術的なメモをちょろっと書いてみようと思います。
書籍などでは 「InitiationDispatcher はしばしば Singleton として実装される」というようなことを書いていたりしますが、InitiationDispatcher を Singleton にしない方がよいです。本に書いてあるのは Singleton として実装されているのをよく見かけるという程度の意味であり、Singleton として実装することを薦めているわけではありません(このことは Reactor に限った話ではありません)。なにかの理由で2つ以上スレッドを起動してそれぞれのスレッドで InitiationDispatcher を動かそうと思った場合、まず Singleton では対応できません。スレッドを1つしか使わない場合でも、Singleton である必要はありません。EventHandler が InitiationDispatcher に対して register_handler や remove_handler を実行したい場合もあるでしょうが、そういう場合のために InitiationDispatcher が handle_event 関数を呼び出すときに自分自身の参照を渡してあげればよいのです。そうすれば各 EventHandler から InitiationDispatcher にアクセスできます。
以下に簡単な模擬コードを示します。
class InitiationDispatcher;
class EventHandler
{
...
virtual void handle_event(InitiationDispatcher&, event_type) = 0;
...
};
class InitiationDispatcher
{
...
void handle_events();
void register_handler(EventHandler&);
void remove_handler(EventHandler&);
...
};
void InitiationDispatcher::handle_events()
{
for(;;) {
...
eventHandler->handle_event(*this, event);
...
}
}
実際、このやり方でほとんど不自由しませんでした。