Louis-Philippe
2/16/2009 10:20:00 PM
[Note: parts of this message were removed to make it a legal post.]
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 <default@spiralix.org>
> 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 <tristin.colby@gmail.com>
>
> 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.
>>
>> <code>
>> $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
>>
>>
>>
>