通过推送通知唤醒

时间:2013-07-14 05:18:21

标签: ruby multithreading fibers

假设:

  • 有一些对象(例如,数组a)和依赖于对象的条件(例如,a.empty?)。
  • 当前线程以外的某些线程可以操作对象(a),因此条件的评估值的真实性随时间而变化。

当条件满足时,如何让当前线程在代码中的某个点休眠并通过推送通知继续(唤醒)?

我不想这样做投票:

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

也许使用Fiber将是一个线索。

1 个答案:

答案 0 :(得分: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