как управлять ресурсами процессора и синхронизировать потоки в common lisp

#multithreading #common-lisp

#многопоточность #common-lisp

Вопрос:

Я ищу некоторые советы или рекомендации по работе с потоками в common lisp. По сути, я пытаюсь синхронизировать некоторые потоки с глобальной переменной clock (также заданной как поток). Я немного смущен различными понятиями, такими как join-process, process-wait, make-mutex / make-lock, condition-variable и т. Д. Я использую ccl и sbcl, поэтому мне, вероятно, следует использовать bordeaux-threads, но это просто удобный способ управления обоими. Короче говоря, мой код работает, но когда я добавляю поток, вместо того, чтобы совместно использовать ресурсы ЦП, этот поток увеличивается более чем на 150%.

 ;; for instance using CCL64 Version 1.12 DarwinX8664
;; --- THREADS-SET-1
(defvar  buffer  nil)
(defvar  buffer-size  30)
(defparameter  compute 
  (ccl:process-preset (ccl:make-process " compute ")
               #'(lambda ()
               (loop do
                (push (do-some-computation)  buffer )
                (sleep 0.1)))
               ' compute ))

(defparameter  osc-send 
  (ccl:process-preset (ccl:make-process " osc-send ")
               #'(lambda ()
               (loop do
                (when  buffer 
                  (OSCsend (car (last  buffer )))
                  (setf  buffer  (butlast  buffer ))
                  (if (> (length  buffer )  buffer-size )
                      (ccl:process-suspend  compute )
                      (ccl:process-resume  compute )))
                (sleep (some-time))))
               ' osc-send ))
;; commands:
(progn
  (ccl:process-enable  compute )
  (sleep 1)
  (ccl:process-enable  osc-send ))
(progn
  (ccl:process-suspend  compute )
  (ccl:process-suspend  osc-send ))
(progn
  (ccl:process-resume  compute )
  (ccl:process-resume  osc-send ))
(progn
  (ccl:process-kill  compute )
  (ccl:process-kill  osc-send ))

;; when these threads as THREADS-SET-1 are 'playing' dx86cl64 takes more than 90% of cpu
;; and when I add some other threads as THREADS-SET-2, the cpu goes beyond 150%
;; needless to say that I did not try to add a third one before to solve this issue...
 

Последняя идея заключается в синхронизации ПОТОКОВ-SET-1 и ПОТОКОВ-SET-2 с помощью clock .
Возможно, lparralel может быть уместным в этом контексте, если это так, благодаря иллюстрации того, как его использовать в этом случае. Заранее спасибо за любую помощь или любую справочную книгу, чтобы узнать об этой теме.

Комментарии:

1. обратите внимание, что при мониторинге загрузки процессора, если у вас 8 ядер, процентное соотношение может превышать 100% ( unix.stackexchange.com/questions/145247 /… )

2. вокруг ccl:process-preset слишком много пар круглых скобок, это выглядит как вызов функции (f) с чем-то, что не является функцией, т.Е. f = (ccl:process-preset …); скобки имеют смысл в Lisp

3. Извините, это была ошибка опечатки.

4. У меня всего 2 ядра!

Ответ №1:

Наконец, я решил проблему, создав один отдельный поток для каждой «процедуры» плюс один для «часов». Затем активность процессора снизилась примерно до 50% для 3 подпрограмм. В любом случае, я был бы рад, если бы кто-нибудь мог объяснить, почему в первом примере потоки используют все эти ресурсы процессора, а не когда я выполняю один поток по процедуре. Я подозреваю использование приостановки / возобновления процесса вместо мьютекса… За этим нужно следить! 🙂