#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 подпрограмм. В любом случае, я был бы рад, если бы кто-нибудь мог объяснить, почему в первом примере потоки используют все эти ресурсы процессора, а не когда я выполняю один поток по процедуре. Я подозреваю использование приостановки / возобновления процесса вместо мьютекса… За этим нужно следить! 🙂