From: Julian Leviston Date: 2009-02-17T12:40:40+09:00 Subject: Re: Ruby Threading question Creating 4 threads That won't ever exit the thread because puts returns nil. Blog: http://random8.zenunit.com/ Learn rails: http://sensei.zenunit.com/ On 17/02/2009, at 9:10 AM, Louis-Philippe wrote: > 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 >> >> >>