あるスレッドが別のスレッドに、注意を喚起する必要が生じたことをシグナルとして通知できる点で、イベントはセマフォと似ています。イベントは、セマフォと比べて柔軟ですが、少し複雑になります。その理由の 1 つは、イベントを一度ポストすると、そのイベントを明示的にクリアする必要があるということです。
例
次のコード例では、セマフォ同期のかわりにイベント同期を使用して作成者/使用者間 (Producer-Consumer) の問題を解決します。
Working-Storage Section. 01 produced-event usage event-pointer. 01 data-value pic x(4) comp-x value 0. 01 consumed-event usage event-pointer. * Initialization code executed while in single threaded mode open produced-event open consumed-event set consumed-event to true *> Initialize as 'posted' * Protocol for the producer side wait for consumed-event set consumed-event to false *> Clear event add 10 to data-value * Signal that data value has changed set produced-event to true *> Post event * Protocol for the consumer side, waiting for the data-value * to change wait for produced-event set produced-event to false *> Clear event display data-value * Signal other thread that it can proceed, this thread has * data-value set consumed-event to true *> Post event
上記のコードを実行するスレッドが 2 つ (作成スレッドと使用スレッド) のみの場合は、問題なく動作します。これ以外のスレッドが作成スレッドまたは使用スレッドとして起動された場合は、予期しないイベントが発生します。これは、イベントがセマフォとは異なり、一度ポストされるとそのイベントの発生を待っているスレッドをすべてアクティブにするためです。セマフォの場合は、セマフォが解放された後は 1 つのスレッドのみの実行を可能にします。イベントがポストされ、待ち状態のスレッドがアクティブ化されると、これらの各スレッドはそのイベント (イベントのクリアを含む) に対して、何らかのアクションを行うべきかどうかを決定する必要があります。
最後のポイントとして、待ち状態の複数のスレッドが存在し、特定の用途のために独自の同期オブジェクトの構築を可能にする場合には、イベントの使用は難しくなります。