3

仮定する:

  • いくつかのオブジェクト (例: 配列a) と、オブジェクトに依存する条件 (例: などa.empty?) があります。
  • 現在のスレッド以外の一部のスレッドはオブジェクト ( a) を操作できるため、条件の評価値の真偽は時間の経過とともに変化します。

現在のスレッドをコードのある時点でスリープ状態にし、条件が満たされたときにプッシュ通知で続行 (ウェイクアップ) するにはどうすればよいですか?

私はこのようなポーリングをしたくありません:

...
sleep 1 until a.empty?
...

おそらく、使用Fiberすることが手がかりになるでしょう。

4

1 に答える 1

3

あなたの質問をよく理解していないかもしれませんがConditionVariable、そのような問題に対する良いアプローチだと思います。

そのため、ConditionVariable何かが発生したときにスレッドにシグナルを送るために使用できます。どれどれ:

require 'thread'

a = [] # array a is empty now
mutex = Mutex.new
condvar = ConditionVariable.new 

Thread.new do
  mutex.synchronize do
    sleep(5)
    a << "Hey hey!"
    # Now we have value in array; it's time to signal about it
    condvar.signal
  end
end

mutex.synchronize do
  condvar.wait(mutex)
  # This happens only after 5 seconds, when condvar recieves signal
  puts "Hey. Array a is not empty now!"
end
于 2013-07-14T06:21:31.660 に答える