【Ruby3.x】MonitorMixin::ConditionVariable::broadcast()メソッドの使い方
broadcastメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
broadcastメソッドは、MonitorMixin::ConditionVariableオブジェクトのwaitメソッドによって特定の条件が満たされるまで待機している、すべてのスレッドに対し、条件が変化したことを通知して再開させるメソッドです。
このメソッドは、複数のスレッドが共有する資源や状態の変化を待っている場合に特に有用です。例えば、システム内で管理されているデータが更新され、その新しいデータを必要としている複数のワーカー(スレッド)が待機している状況を想定してください。broadcastメソッドを使用することで、データ更新が完了した時点で、待機中の全てのワーカーに対して一斉に「処理を再開してよい」という信号を送ることができます。これにより、各ワーカーは更新されたデータが利用可能になったことを確認し、自身の処理を再開することが可能となります。
同じくスレッドに通知を送るsignalメソッドが待機中のスレッドの中から一つだけを選んで再開させるのに対し、broadcastメソッドは、条件変数で待機しているすべてのスレッドに同時に通知を送る点が最大の特徴です。そのため、一度のイベントで多くのスレッドを再開させる必要がある場合に、このメソッドが適しています。
broadcastメソッドを呼び出す際は、関連するモニター(ロック)が取得されている必要があります。通知を受け取ったスレッドは、スケジューラの都合によりすぐに実行されるとは限らず、また、意図しない再開(スプリアスウェイクアップ)の可能性もあるため、再度条件が満たされているかを明確に確認するループ内で処理を行うことが一般的なプラクティスとされています。
構文(syntax)
1require 'monitor' 2 3monitor = Monitor.new 4condition_variable = monitor.new_cond 5 6monitor.synchronize do 7 # ... 条件が満たされたことを示す処理 ... 8 condition_variable.broadcast 9end
引数(parameters)
引数なし
引数はありません
戻り値(return)
self
このメソッドは、待機している全てのスレッドに通知を送信し、それらを再開させます。処理の完了を示すために使用され、メソッド呼び出し元のオブジェクト自身が戻り値として返されます。