(use-modules (ice-9 q)) (use-modules (ice-9 threads)) (use-modules (srfi srfi-9)) (define make-queue make-q) (define push! enq!) (define pop! deq!) (define empty? q-empty?) ;; mini pool library (define-record-type (%make-pool queue mutex threads) pool? (queue pool-queue) (mutex pool-mutex) (threads pool-threads)) (define (make-handler queue mutex init proc) (lambda () (init) (let loop () (lock-mutex mutex) (if (not (empty? queue)) (let ((item (pop! queue))) (unlock-mutex mutex) (proc item)) (unlock-mutex mutex)) (loop)))) (define (make-pool init proc size) (let* ((queue (make-queue)) (mutex (make-mutex 'unchecked-unlock)) (threads (map (lambda (x) (call-with-new-thread (make-handler queue mutex init proc))) (iota size)))) (%make-pool queue mutex threads))) (define (pool-push pool item) (with-mutex (pool-mutex pool) (push! (pool-queue pool) item))) ;; (define pool (make-pool (lambda () (pk 'init (current-thread))) (lambda (item) (format #t "~s~s\n" (current-thread) item)) 5)) (use-modules (srfi srfi-26)) (for-each (cut pool-push pool <>) (iota 1090)) (let loop () (loop))