イベントの使用

あるスレッドが別のスレッドに、注意を喚起する必要が生じたことをシグナルとして通知できる点で、イベントはセマフォと似ています。イベントは、セマフォと比べて柔軟ですが、少し複雑になります。その理由の 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 つのスレッドのみの実行を可能にします。イベントがポストされ、待ち状態のスレッドがアクティブ化されると、これらの各スレッドはそのイベント (イベントのクリアを含む) に対して、何らかのアクションを行うべきかどうかを決定する必要があります。

最後のポイントとして、待ち状態の複数のスレッドが存在し、特定の用途のために独自の同期オブジェクトの構築を可能にする場合には、イベントの使用は難しくなります。