#!/usr/local/bin/ruby # -*- mode: ruby -*- # $Id: prodcons.ruby,v 1.2 2000/12/20 04:33:20 doug Exp $ # http://www.bagley.org/~doug/shootout/ require 'thread' def main(n) mutex = Mutex.new access = ConditionVariable.new count = data = consumed = produced = 0 consumer = Thread.new do i = 0 loop do mutex.synchronize { while count == 0 do access.wait(mutex) end i = data count = 0 access.signal } consumed += 1 if i == n then break end end end producer = Thread.new do for i in 1 .. n do mutex.synchronize { while count == 1 do access.wait(mutex) end data = i count = 1 access.signal } produced += 1 end end producer.join consumer.join puts "#{produced} #{consumed}" end main(Integer(ARGV.shift || 1))