スレッドは、計算を割り当てる単位であり、普通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 [関数]
-
-
threadにsys:thread関数によって与えられたfuncallの評価が
終了するのを待ち、その結果を受け取り、返す。
もし、スレッドにsys:threadによって評価が割り当てられたならば、
sys:wait-threadは、必須である。
なぜなら、スレッドは結果を転送し終わるまでスレッドプールに戻らない
ためである。
sys:plist &rest forms [マクロ]
-
-
異なったスレッドにより並列にformsを評価し、
すべての評価が終了するのを待ち、
結果のリストを返す。
sys:plistは、リスト化されたそれぞれのformが関数呼び出しされる
ことを除いて、parallel-listとしてみなされるだろう。
2016-04-05