enq
(enqueue) method or its synonym push
.
deq
(dequeue) method as needed.
(The pop
and shift
methods are synonyms for deq
.)
deq
method blocks if the queue is
empty and waits until the producer thread adds a value to the queue.
map
with
a concurrent inject
.
Ejemplo de uso:
if $0 == __FILE__ a = if ARGV.empty? [-2,-1,0,1,2] else ARGV.map &:to_f end mapper = lambda {|x| x*x } # Compute squares injector = lambda {|total,x| total+x } # Compute sum result = a.conject(0, mapper, injector) # => 10 puts result end
Código:
[~/ruby/threads(master)]$ cat conject.rb require 'thread' module Enumerable # Concurrent inject: expects an initial value and two Procs def conject(initial, mapper, injector) # Use a Queue to pass values from mapping threads to injector thread q = Queue.new count = 0 # How many items? each do |item| # For each item Thread.new do # Create a new thread q.enq(mapper[item]) # Map and enqueue mapped value end count += 1 # Count items end t = Thread.new do # Create injector thread x = initial # Start with specified initial value while(count > 0) # Loop once for each item x = injector[x,q.deq] # Dequeue value and inject count -= 1 # Count down end x # Thread value is injected value end t.value # Wait for injector thread and return its value end end