[Ruby] deadlock detected (fatal)
-
Hallo!
Folgender Code:
#!/usr/bin/ruby -w require 'thread' $data_mutex = Mutex.new() $new_data = ConditionVariable.new() def buf_thread() loop do tmp = "" while tmp.length() < 8192 puts "1: read" tmp += "X"*8192 end puts "1: syncronize" $data_mutex.synchronize() do $data = tmp.dub() end puts "1: broadcast" $new_data.broadcast() end end Thread.start() { buf_thread() } loop do puts "2: synchronize" $data_mutex.synchronize() do puts "2: wait" $new_data.wait($data_mutex) puts "2: write" puts($data) end end
Zwei Threads. Ein Thread liest Daten von irgendwo und schreibt sie in einen gemeinsam genutzben Puffer. Dann signalisiert er den anderen Threads (hier nur einer), dass neue Daten vorhanden sind. Die anderen Threads warten auf das Signal und schreiben die Daten daraufhin irgendwo hin.
Sinn der Sache: Daten aus einer Quelle sollen an mehrere Clients gestreamt werden.
Beim Ausführen des Programms bekomme ich die Meldung:
/usr/lib64/ruby19/1.9.1/thread.rb:68:in
sleep': deadlock detected (fatal) from /usr/lib64/ruby19/1.9.1/thread.rb:68:in
wait'
from ./test.rb:29:inblock (2 levels) in <main>' from <internal:prelude>:8:in
synchronize'
from ./test.rb:27:inblock in <main>' from ./test.rb:25:in
loop'
from ./test.rb:25:in `<main>'Was mache ich falsch?
Danke im Voraus!
-
Hi,
setz mal nach dem require folgende Zeile:
Thread.abort_on_exception = true
Dies sollte dann so aussehen:
require 'thread' Thread.abort_on_exception = true $data_mutex = Mutex.new() $new_data = ConditionVariable.new()
Nun wirst du in den folgenden Fehler laufen:
1: read 1: syncronize t1.rb:16:in `buf_thread': undefined method `dub' hodError) from t1.rb:15:in `synchronize' from t1.rb:15:in `buf_thread' from t1.rb:8:in `loop' from t1.rb:8:in `buf_thread' from t1.rb:23 from t1.rb:23:in `start' from t1.rb:23
Hier erkennst du, dass tmp keine Methode dub kennt.
Wenn du diesen Fehler behoben hast, wird es laufen.Gruß mcr