【Ruby3.x】MonitorMixin::ConditionVariable::wait()メソッドの使い方
waitメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
waitメソッドは、RubyのMonitorMixin::ConditionVariableクラスに属し、現在のスレッドを一時的に停止させ、特定の条件が満たされるまで待機させるためのメソッドです。
このメソッドが呼び出されると、まず呼び出し元のスレッドは、関連付けられているMonitorMixinオブジェクトが保持するロックを一時的に解放します。その後、自身のスレッドを休止状態にし、他のスレッドがロックを取得して共有リソースにアクセスしたり、条件を変更したりできるようにします。
スレッドは、同じConditionVariableオブジェクトに対して別のスレッドがsignalメソッド(待機中のスレッドのうち一つを起床させる)またはbroadcastメソッド(待機中のすべてのスレッドを起床させる)を呼び出すまで待機します。待機状態から解除されたスレッドは、再びMonitorMixinオブジェクトのロックを取得しようと試みます。ロックが正常に取得できた後、waitメソッドの呼び出し元から実行を再開します。
waitメソッドには、オプションとしてtimeout引数(秒数)を指定することができます。timeoutが指定された場合、指定された時間が経過してもsignalやbroadcastが呼び出されない場合、スレッドは自動的に待機を終了し、ロックを再取得して処理を再開します。
このメソッドは、複数のスレッド間で特定の条件に基づく同期処理を実現するために非常に重要です。共有リソースへの安全なアクセスや、イベント発生を待って処理を進めるような並行処理パターンを構築する際に利用されます。
構文(syntax)
1require 'monitor' 2 3class MySynchronizedResource 4 include MonitorMixin 5 6 def initialize 7 super # Initialize MonitorMixin 8 @data_ready = new_cond # Creates a ConditionVariable instance 9 @has_data = false 10 end 11 12 def consumer_thread_method 13 synchronize do # Acquire the monitor lock 14 until @has_data 15 # リリースされたモニターロックを再取得し、@data_readyからの通知を待機します。 16 # オプションでタイムアウトを秒単位で指定できます(例:5秒)。 17 @data_ready.wait(5) 18 # `wait`から復帰すると、モニターロックは自動的に再取得されます。 19 end 20 # データが利用可能になったか、タイムアウトが発生した場合の処理 21 @has_data = false # データの処理後、状態をリセット 22 end 23 end 24 25 def producer_thread_method 26 synchronize do # Acquire the monitor lock 27 # データ生成の処理... 28 @has_data = true 29 @data_ready.signal # 待機中のスレッドのいずれか一つに通知 30 end 31 end 32end
引数(parameters)
timeout = nil
- timeout = nil: 待機を継続する最大時間(秒)。nil を指定すると、条件が通知されるまで無限に待機します。
戻り値(return)
MonitorMixin::ConditionVariable | false
このメソッドは、スレッドを一時停止させ、条件が満たされるまで待機させます。条件が満たされてスレッドが再開された場合、trueを返します。タイムアウトが発生した場合はfalseを返します。