Waking up by push notification

喜欢而已 提交于 2019-12-06 08:28:22

问题


Suppose:

  • There is some object (e.g., an array a) and a condition dependent on the object (e.g., such as a.empty?).
  • Some threads other than the current thread can manipulate the object (a), so the truthness of the evaluated value of the condition changes over the time.

How can I let the current thread sleep at some point in the code and continue (wake up) by push notification when the condition is satisfied?

I do not want to do polling like this:

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

Perhaps using Fiber will be a clue.


回答1:


Maybe I do not quite understand your question, but I guess ConditionVariable is a good approach for such problem.

So, ConditionVariable can be used to signal threads when something happens. Let's see:

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


来源:https://stackoverflow.com/questions/17636746/waking-up-by-push-notification

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!