From: Louis-Philippe Date: 2009-02-17T07:19:42+09:00 Subject: Re: Ruby Threading question Creating 4 threads --001636c5ad4d3815fa04631095cc Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit and looking at it more, I think it would be better to leave the less stuff in the mutex block as possible, making it something something like: mu.synchronize do job = $jobs.pop end 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? I guess the Thread.exit could have caused a deadlock if inside the mutex, and since the mutex locks your other threads you better keep it as small as possible for efficiency sake. 2009/2/16 Louis-Philippe > 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 >> >> >> > --001636c5ad4d3815fa04631095cc--