Arc Forumnew | comments | leaders | submitlogin
How do you wait until a group of threads exit?
2 points by lark 3878 days ago | 7 comments
I would like to start a few threads and then wait until all of them exit before continuing execution. How do you do this in Arc?


3 points by akkartik 3878 days ago | link

http://arclanguage.github.io/ref/threading.html

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>

-----

3 points by fallintothis 3878 days ago | link

Slick! But just to play human lint tool:

  (~all t (map dead threads))
is the same as

  (~all dead threads)
and

  (while (~all dead threads)
    (sleep 1))
is the same as

  (until (all dead threads)
    (sleep 1))
which may read slightly better.

-----

2 points by akkartik 3878 days ago | link

Thanks! So weird that I missed that, especially the first.

-----

2 points by lark 3878 days ago | link

Thanks.

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?

-----

2 points by akkartik 3877 days ago | link

I see racket does provide thread-wait:

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?

-----

3 points by lark 3872 days ago | link

Thanks so much for the link, that was it.

  $ 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))
And an example using wait-thread:

  (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")))))

-----

2 points by akkartik 3872 days ago | link

Just tried your example. Nice!

-----