Перезапустить вышедший поток в Common Lisp Bordeaux Threads? - PullRequest
1 голос
/ 14 марта 2019

Есть ли способ перезапустить поток, который завершил свою задачу, чтобы избежать накладных расходов на создание нового потока для следующей задачи?(Обратите внимание, что все остальные процессоры / потоки будут заняты, и (not (bt:thread-alive-p thread) сигнализирует, когда поток мертв.) Например, я пробовал bt: interrupt-thread на завершенном потоке, но это не работает:

* (defparameter *x* 0)
*X*
* (let ((thread (bt:make-thread (lambda () (setf *x* (loop for i from 1 to 10 sum i))))))
    (sleep 1)
    (print *x*)
    (bt:interrupt-thread thread (lambda () (setf *x* (loop for i from 1 to 100 sum i))))
    (sleep 1)
    (print *x*))

55
debugger invoked on a SB-THREAD:INTERRUPT-THREAD-ERROR in thread
#<THREAD "main thread" RUNNING {10012E0613}>:
  Interrupt thread failed: thread #<THREAD "Anonymous thread" FINISHED 
values: 55 {1005D410D3}> has exited.

Кроме того, есть ли способ получить доступ к результату (в потоке), возвращенному функцией, переданной в bt: make-thread, чтобы избежать необходимости общаться через глобальную переменную, как в примере выше?

1 Ответ

2 голосов
/ 14 марта 2019

Когда это закончено, это закончено. Обычная техника - заставить потоки выполнять цикл, который ждет некоторой работы на каком-то канале.

Библиотеки, такие как lparallel или chanl , могут очень помочь.

Например, вы можете использовать chanl так:

(defun parallel-mayhem (fun count)
  (let* ((start-chan (make-instance 'chanl:channel))
         (results-chan (make-instance 'chanl:channel)))
    (loop :repeat count
          :do (chanl:pexec ()
                (chanl:send start-chan "starting")
                (chanl:send results-chan (funcall fun))))
    (loop :repeat count
          :collect (chanl:recv start-chan))
    (format t "All started.")
    (loop :repeat count
          :collect (chanl:recv results-chan))))

Под капотом chanl используется простой пул потоков. Вы можете взглянуть на то, как он это делает, он довольно лаконичен и читабелен.

...