2010-03-29 4 views
2

Dans Ruby, je veux avoir deux fils en cours d'exécution en même temps, et que vous voulez le fil d'arrière-plan pour signaler périodiquement le fil de premier plan. Comment puis-je bloquer le fil de premier plan jusqu'à ce que le fil d'arrière-plan dise «aller»? Je peux penser à quelques façons de le faire, mais je suis après le plus approprié, idiomatiques méthode Ruby.Ruby multithreading: faire un fil d'attente pour un signal d'un autre

Dans le code:

loop do # background, thread 1 
    sleep 3 
    receive_input 
    tell_foreground_input_is_ready # <-- how do I do this? 
end 

et

loop do # foreground, thread 2 
    wait_for_signal_from_background # <-- how do I do this? 
    do_something 
end 

(Note:.. Arrière-plan peut signaler plusieurs fois au premier plan de chaque avant-plan le temps fini de l'attente, il remet à zéro carnet de commandes) Vous

Répondre

1

Transforme ce fonctionne assez bien:

require 'thread' 
queue = Queue.new 
Thread.new do 
    100.times do |i| 
    sleep 1 
    queue.enq i 
    end 
end 

loop do 
    print "waiting... " 
    puts queue.deq  # this function blocks. 
end 
+0

En IRM (« C » versions Ruby 1.8.6 ou 1.9.2) cela fonctionnera, car il y a un géant grande écluse autour de tout le code Ruby, donc même si vous avez 2 fils, ne peut jamais fonctionner à la fois ... en JRuby ou IronRuby cependant, les fils courront en même temps, et le code ne sera pas en sécurité. Vous aurez besoin d'utiliser '' Mutex' et ConditionVariable' pour gérer cette –

1

« d veulent utiliser des variables et des mutex conditionnelles, selon this page

Questions connexes