スレッド生成

スレッドは、計算を割り当てる単位であり、普通lisp書式を評価する ための単位である。 Euslispのスレッドは、threadクラスのインスタンスによって 表現される。 このオブジェクトは、内容を表現するスレッド全体というよりはむしろ、 実際に引き数と結果を渡すためのスレッドの 制御ポートであり、評価を始めるものである。



sys:make-thread num &optional (lsize 32*1024) (csize lsize) [関数]

lsizeワードのlispスタックとcsizeワードのC-スタックを持つ スレッドをnum個だけ生成し、システムのスレッドプールに 置く。 スレッドプール内のすべてのスレッドは、sys:*threads*に束ねてあり、 make-threadが呼び出されたときに拡張される。 thread関数によって、計算はスレッドプールの中で空いたスレッドの 1つに割り当てられる。 したがって、指定された計算がどのスレッドに割り当てられるか 制御できないため、スレッドのスタックサイズを変更する方法が無い。


sys:*threads* [変数]

make-threadによって作成されたすべてのスレッドのリストを持つ。


sys::free-threads [関数]

スレッドプール内の空いたスレッドのリストを返す。 もし、結果がNILならば、スレッドへのタスクの新しい付託は現在実行されている スレッドのどれかの評価が終了するかあるいは make-threadによってスレッドプールに新しいスレッドを生成するまで 停止される。


sys:thread func &rest args [関数]

スレッドプールから空いたスレッドを1つ取り出し、 (func . args)の評価のためにそれを割り当てる。 sys:threadは、argsを展開したリストにfuncを適用 するが、関数の適用結果を受け取らないため、 非同期のfuncallとみなすことができる。 むしろ、sys:threadはfuncallに割り当てられたスレッド オブジェクトを返すので、実際の結果はsys:wait-threadによって 後から得ることができる。


(defun compute-pi (digits) ...)
(setq trd (sys:thread \#'compute-pi 1000)) ;assign compute-pi to a thread
...  ;; other computation 
(sys:wait-thread trd) ;get the result of (compute-pi 1000)

sys:thread-no-wait func &rest args [関数]

空いたスレッドの1つに計算を割り当てる。 スレッドは、wait-threadされることなしに、 評価が終了したとき、スレッドプールに戻される。


sys:wait-thread thread [関数]

threadsys:thread関数によって与えられたfuncallの評価が 終了するのを待ち、その結果を受け取り、返す。 もし、スレッドにsys:threadによって評価が割り当てられたならば、 sys:wait-threadは、必須である。 なぜなら、スレッドは結果を転送し終わるまでスレッドプールに戻らない ためである。


sys:plist &rest forms [マクロ]

異なったスレッドにより並列にformsを評価し、 すべての評価が終了するのを待ち、 結果のリストを返す。 sys:plistは、リスト化されたそれぞれのformが関数呼び出しされる ことを除いて、parallel-listとしてみなされるだろう。




2016-04-05