Comment detail

ワーカスレッドを安全に終了させるまで待機 (Nested Flatten)
Common Lispの標準的なスレッドの扱いというものを良く分かっていないのですが、
スレッドプールを使ってスレッドを使い回すようなライブラリは探してみたものの
自分には見付けられませんでした。ということで、Portable-Threadsを利用して、
サブの全スレッドの終了をみとって次の仕事へ…というような内容になっています。
識者のツッコミ大歓迎です。
実行結果:
(spawn-thread 'main #'main
	      (lambda () (subjob (gensym)))
	      (lambda () (subjob (gensym)))
	      (lambda () (subjob (gensym)))
	      (lambda () (subjob (gensym))) )
; =>
;G3233(14 sec.) Start.
;G3236( 6 sec.) Start.
;G3238(12 sec.) Start.
;G3239( 7 sec.) Start.
;G3236( 6 sec.) Stop.
;G3239( 7 sec.) Stop.
;G3238(12 sec.) Stop.
;G3233(14 sec.) Stop.
;All threads finished.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
(defpackage #:doukaku-116 (:use #:cl #:portable-threads))
(in-package #:doukaku-116)

(defun subjob (name)
  (let ((sleep (+ 5 (random 10))))
    (format t "~&~A(~2D sec.) Start.~%" name sleep)
    (sleep sleep)
    (format t "~&~A(~2D sec.) Stop.~%" name sleep)))

(defun main (&rest jobs)
  (do ((ths (mapcar (lambda (exe) (spawn-thread (gensym) exe)) 
                    jobs)))
      ((notany #'thread-alive-p ths)
       (format t "~&All threads finished.~%"))))

「標準的」というのは私も知りませんです。Allegro CLの場合はmultiprocessingパッケージというのがついてくるので普段はそれを使っています (名前はprocessですが実態はネイティブスレッド)。

スレッドプールについても標準的なものがあるのかどうかは知りません。昔、Allegroのmultiprocessingの上に書いたスレッドプールパッケージがあるんですが、ここにそのまま出せない事情があるので、もし時間が取れれば簡単なバージョンを書いてポストします。 (ほんとはコードを書いてポストしようと思ってたんだけど、時間がきつきつなので…)

コメント頂きありがとうございます。とても参考になりました。自分もAllegro CL試してみたいと思います。 スレッドプールのコードについては、興味津々です。いつかお手隙の際にでもポストして頂けたらと思います。

Index

Feed

Other

Link

Pathtraq

loading...