Hi!
I'm trying to figure out a parallel implementation of for-each (I'm going to use it for spawning system processes mostly). Anyway, the problem is like this: If I use any kind of recursion inside the thread created in the (new-thread) proc, I get this error: *** ERROR IN for-each -- Uncaught exception: #<type-exception #31> (thread-join! '#<thread #32>)
As soon as I remove the call to (recur) (it would happen also with letrec for instance), it works as expected. I really don't understand how internal recursion in the thread could yield this error.
Thanks for your help
(define (parallel-for-each f l #!key (max-thread-number 2)) (let* ((pending-jobs l) (jobs-mutex (make-mutex)) (available-jobs? (lambda () (mutex-lock! jobs-mutex) (let ((more? (not (null? pending-jobs)))) (mutex-unlock! jobs-mutex) more?))) (next-element (lambda () (mutex-lock! jobs-mutex) (let ((next (car pending-jobs))) (set! pending-jobs (cdr pending-jobs)) (mutex-unlock! jobs-mutex) next))) (results '()) (results-mutex (make-mutex)) (add-to-results! (lambda (r) (mutex-lock! results-mutex) (set! results (cons r results)) (mutex-unlock! results-mutex)))) (let ((new-thread (lambda () (thread-start! (make-thread (lambda () (let recur () (add-to-results! (f (next-element))) (if (available-jobs?) (recur) (thread-yield!))))))))) (let do-times ((n 0) (thread-pool '())) (if (< n max-thread-number) (do-times (++ n) (cons (new-thread) thread-pool)) (for-each thread-join! thread-pool)))) (reverse results)))