2013-07-14 3 views
3

Предположим:Проснувшись выталкивания уведомления

  • Существует некоторый объект (например, массив a) и условие зависит от объекта (например, таких, как a.empty?).
  • Некоторые потоки, отличные от текущего потока, могут манипулировать объектом (a), поэтому истинность оцениваемого значения условия изменяется с течением времени.

Как я могу позволить текущей нитке спать в какой-то момент кода и продолжать (просыпаться) путем push-уведомления, когда условие выполняется?

Я не хочу, чтобы сделать опрос, как это:

... 
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