#!/usr/local/bin/pike// -*- mode: pike -*- // $Id: prodcons.pike,v 1.3 2000/12/20 05:03:58 doug Exp $ // http://www.bagley.org/~doug/shootout/ inherit Thread.Condition: access; inherit Thread.Mutex: mutex; int data, consumed, produced, count; void producer(int n) { for (int i=1; i<=n; i++) { object mtx = mutex::lock(); while (count != 0) access::wait(mtx); data = i; count += 1; destruct(mtx); access::signal(); produced += 1; } } void consumer(int n) { while (1) { object mtx = mutex::lock(); while (count == 0) access::wait(mtx); int i = data; count -= 1; access::signal(); destruct(mtx); consumed += 1; if (i == n) break; } } void main(int argc, array(string) argv) { int n = (int)argv[-1]; if (n < 1) n = 1; data = consumed = produced = count = 0; thread_create(producer, n); consumer(n); write("%d %d\n", produced, consumed); }