From: Louis-Philippe Date: 2009-02-17T07:10:16+09:00 Subject: Re: Ruby Threading question Creating 4 threads --001636c5b4229b86640463107367 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit what if you put your thread body in an infinite loop, something like: Thread.new do loop do puts "Thread #{c} created" job = nil mu.synchronize do job = $jobs.pop puts "Checking for #{job}" #Exit our thread if we have no more jobs to check puts "No more jobs" and Thread.exit if job.nil? end t = count_files(job) mu.synchronize { total += t } end end and as you may have noticed, I replaced the 'return' statement inside your thread with a 'Thread.exit' method. I think it would be the right way to do it... 2009/2/16 > Newbie Question: > > I have some code where I create 4 threads that pop elements off an > array and process them. The problem is that each thread only pops off > one element, processes it, then returns; they don't continue to > process until the entire array is consumed. > > > $jobs = %w[a b c d e f g] > def simulate_cleanup > > puts "Checking for #{$jobs.length} jobs in /mnt/gen1/focal/temp" > threads = [] > > mu = Mutex.new > total = 0 > > 1.upto(4) do |c| > threads << Thread.new do > puts "Thread #{c} created" > job = nil > > mu.synchronize do > job = $jobs.pop > puts "Checking for #{job}" > #Exit our thread if we have no more jobs to check > puts "No more jobs" and return if job.nil? > end > > t = count_files(job) > mu.synchronize { total += t } > end > end > threads.each { |t| t.join } > > puts "Reduced by #{total} files" > end > > Example of output: > Thread 1 created > Thread 2 created > Thread 3 created > Thread 4 created > Checking for a > Checking for b > Checking for c > Checking for d > > > --001636c5b4229b86640463107367--