[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:inwait'
    from ./test.rb:29:in block (2 levels) in <main>' from <internal:prelude>:8:insynchronize'
    from ./test.rb:27:in block in <main>' from ./test.rb:25:inloop'
    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


Anmelden zum Antworten