2010-03-10 6 views
5

루비에서 스레딩이 어떻게 작동하는지에 대한 근본적인 오해와 나는 약간의 통찰력을 얻기를 희망합니다.SizedQueue를 사용하여 루비 코드에서 교착 상태가 발생했습니다.

나는 단순한 생산자와 소비자를 갖고 싶습니다. 첫째, 파일에서 선을 가져 와서 SizedQueue에 붙여 넣는 제작자 스레드입니다. 사람들이 다 끝났을 때 소비자들에게 일이 끝났음을 알리기 위해 마지막에 토큰을 붙이십시오.

require 'thread' 
numthreads = 2 
filename = 'edition-2009-09-11.txt' 

bq = SizedQueue.new(4) 
producerthread = Thread.new(bq) do |queue| 
    File.open(filename) do |f| 
    f.each do |r| 
     queue << r 
    end 
    end 
    numthreads.times do 
    queue << :end_of_producer 
    end 
end 

몇 명의 소비자가 있습니다. 단순하게하기 위해 아무 것도하지 않도록합시다.

consumerthreads = [] 

numthreads.times do 
    consumerthreads << Thread.new(bq) do |queue| 
    until (line = queue.pop) === :end_of_producer 
     # do stuff in here 
    end 
    end 
end 

producerthread.join 
consumerthreads.each {|t| t.join} 

puts "All done" 

나의 이해 (a)는 SizedQueue 일단 차단 생산자 스레드 (b)는 소비자 스레드가 비워 때 차단의 SizedQueue에서 끌어 가득 결국 그것을 채우고 다시 연락하고 있다는 것입니다 , 결국 끝납니다.

하지만 ruby1.9 (ruby 1.9.1p243 (2009-07-16 개정 24175) [i386-darwin9])에서 조인에 교착 상태 오류가 발생합니다. 무슨 일 이니? 스레드 세이프 (thread-safe)로 간주되는 SizedQueue를 제외하고는 스레드 간의 상호 작용이 어디에 있는지 알 수 없습니다.

어떤 통찰력이라도 대단히 감사하겠습니다.

답변

3

당신의 이해가 정확하고 내 컴퓨터에서 약간 새로운 버전의 Ruby (2009-08-30 트렁크 24705) [i386-darwin10.0.0]와 루비 1.9.2dev (2009-08-30 트렁크 24705) [i386-darwin10.0.0])

+0

우수. 최근 1.9 트렁크에서 작동 함을 확인했습니다. 감사! –

+0

문제 없습니다. 그런 다음 체크 표시를 클릭하여 대답을 "수락"해야합니다. –

관련 문제