Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【Ruby3.x】MonitorMixin::ConditionVariable::wait()メソッドの使い方

waitメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

waitメソッドは、RubyのMonitorMixin::ConditionVariableクラスに属し、現在のスレッドを一時的に停止させ、特定の条件が満たされるまで待機させるためのメソッドです。

このメソッドが呼び出されると、まず呼び出し元のスレッドは、関連付けられているMonitorMixinオブジェクトが保持するロックを一時的に解放します。その後、自身のスレッドを休止状態にし、他のスレッドがロックを取得して共有リソースにアクセスしたり、条件を変更したりできるようにします。

スレッドは、同じConditionVariableオブジェクトに対して別のスレッドがsignalメソッド(待機中のスレッドのうち一つを起床させる)またはbroadcastメソッド(待機中のすべてのスレッドを起床させる)を呼び出すまで待機します。待機状態から解除されたスレッドは、再びMonitorMixinオブジェクトのロックを取得しようと試みます。ロックが正常に取得できた後、waitメソッドの呼び出し元から実行を再開します。

waitメソッドには、オプションとしてtimeout引数(秒数)を指定することができます。timeoutが指定された場合、指定された時間が経過してもsignalbroadcastが呼び出されない場合、スレッドは自動的に待機を終了し、ロックを再取得して処理を再開します。

このメソッドは、複数のスレッド間で特定の条件に基づく同期処理を実現するために非常に重要です。共有リソースへの安全なアクセスや、イベント発生を待って処理を進めるような並行処理パターンを構築する際に利用されます。

構文(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を返します。

関連コンテンツ