Shammer's Philosophy

My private adversaria

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 が終了するまで待つ動作になった。