You could sleep and periodically wake up to check if all the threads are dead.
(def wait-for threads (while (~all t (map dead threads)) (sleep 1))) arc> (do (wait-for (thread:do sleep.1 prn.1) (thread:do sleep.2 prn.2) (thread:do sleep.3 prn.3)) (prn "Done!")) 1 2 3 Done! arc>
-----
(~all t (map dead threads))
(~all dead threads)
(while (~all dead threads) (sleep 1))
(until (all dead threads) (sleep 1))
Shouldn't Arc provide something like pthread_join? A function that wakes up the thread that waits -- rather than continually checking for all threads to exit?
http://docs.racket-lang.org/reference/threads.html#%28part._...
Should be easy to add to arc. Can you submit a pull request if you do so?
$ diff -prauN ac.scm ac.scm.wait --- ac.scm 2013-09-28 10:04:00.907266192 -0400 +++ ac.scm.wait 2013-09-28 10:03:55.811266793 -0400 @@ -1035,6 +1035,7 @@ (xdef new-thread thread) (xdef kill-thread kill-thread) (xdef break-thread break-thread) +(xdef wait-thread thread-wait) (xdef current-thread current-thread) (define (wrapnil f) (lambda args (apply f args) 'nil))
(def th-test() ; how to use wait-thread (withs (counter 0 allthreads nil) (while (< counter 4) (withs (this nil localcnt counter) (= this (thread (do (prn "thread " localcnt) (sleep 2)))) (push this allthreads)) (++ counter)) (each th allthreads (withs (thisthread nil) (= thisthread (wait-thread th)) (prn "thread " thisthread " finished")))))