Clozure CL で Thread を使ってみる【その3】
Clozure CL で Thread を使ってみる【その2】 - Shammerismでは、passive-socket はメインスレッドの中でlisten していたが、これを別のメソッドで行うようにしてみた。
(defmethod queue-listen ((q queue)) (with-open-passive-socket (server "127.0.0.1" 7001) (let ((client (accept-client-socket server))) (format t "Enqueue Client socket.~%") (en-queue q client) (signal-semaphore *semaphore*)))) (let ((my-queue (create-queue))) (process-run-function "take" 'take-from-queue my-queue) (process-run-function "listen" 'queue-listen my-queue) (format t "finish.~%"))
しかし、これを動作させると即刻終了してしまった。作成したスレッドではループするようにしているが、メインスレッド以外でループしていてもその終了を待つようなことはしない。。。まあ、当然か。そう書いていないんだから。join に相当するようなメソッドで上記でいうと listen スレッドの終了を待つ必要がある。変更したバージョンは以下。
(let ((my-queue (create-queue))) (process-run-function "take" 'take-from-queue my-queue) (join-process (process-run-function "listen" 'queue-listen my-queue)) (format t "finish.~%"))
これで listen が終了するまで待つ動作になった。