2012-02-01 42 views
0

我有這個簡單的Ruby代碼:紅寶石線程死鎖致命錯誤

require 'rubygems' 
require 'Thread' 


queue = Queue.new 

t = Thread.new do 
    loop do 
    user = queue.pop 

    puts "Unqueued #{user.nickname}, running all scripts..." 

    #do stuff 
    user.run_all 

    puts "Finished running all script for #{user.nickname}, sleeping for 2" 
    sleep 2 

    queue << user  
    end 
end 

t.join 

當我嘗試運行它,它給了我這個錯誤:

deadlock 0x10ec549f0: sleep:- - ./Machine.rb:9 
deadlock 0x10ea46348: sleep:J(0x10ec549f0) (main) - ./Machine.rb:23 
fatal: Thread(0x10ea46348): deadlock 
    from ./Machine.rb:23:in `join' 
    from ./Machine.rb:23 
    from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:36:in `gem_original_require' 
    from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:36:in `require' 
    from (irb):1 

我在做什麼錯? 感謝

+0

所以它會在下週被刪除?爲什麼?我做錯了什麼?幫我 – 0xSina 2012-02-01 20:06:30

回答

5

您正在嘗試從隊列中彈出的東西,並且隊列爲空。通常你的線程會鎖定,等待另一個線程去推動某些東西。但除了等待線程完成的主進程之外,沒有其他線程。那麼你期望Ruby做什麼?

+0

啊我明白了。但是,如果我從IRB運行此,則該IRB線程是活的,不是嗎? – 0xSina 2012-02-01 20:00:51

+0

因此,有3個線程在總,一個是「T」,第二個是主要(等待「T」來完成)和第三個是IRB線程。和IRB線程仍在運行等待我的輸入,也許我的東西推在隊列中..難道我錯了嗎? – 0xSina 2012-02-01 20:02:01

+0

沒有「IRB線程」,你怎麼推任何東西,如果IRB等待't.join' – 2012-02-01 20:32:19