2013-07-14 85 views
3

假設:醒來通過推送通知

  • 有一些物體(例如,陣列a)和依賴於物體上的條件(例如,如a.empty?)。
  • 除當前線程以外的某些線程可以操作對象(a),因此條件的評估值的真實性隨時間而變化。

如何讓當前線程在代碼中的某個點處休眠,並在條件滿足時通過推送通知繼續(喚醒)?

我不想做輪詢是這樣的:

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

也許使用Fiber將是一個線索。

+1

無論條件是什麼,編寫一個鉤子,任何時候調用您的行爲都會調用它。它可以容納當時可以處理的一組對象,可能是線程或光纖。這可能與[本項目](https://github.com/kristinalim/ruby_hooks)相似 – vgoff

回答

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 
+0

謝謝。太棒了。 – sawa