Multithreading 如何在common lisp中管理cpu资源和同步线程

Multithreading 如何在common lisp中管理cpu资源和同步线程,multithreading,common-lisp,Multithreading,Common Lisp,我正在寻找一些关于CommonLisp中线程的建议或良好实践。基本上,我正在尝试使用全局变量+时钟+(也设置为线程)同步一些线程。我对连接进程、进程等待、生成互斥锁/生成锁、条件变量等不同的概念有点困惑。 我正在使用ccl和sbcl,所以我可能应该使用,但这只是管理两者的一种方便方法。 简言之,我的代码可以工作,但当我添加一个线程,而不是共享cpu资源时,这个线程将增加150%以上 ;; for instance using CCL64 Version 1.12 DarwinX8664 ;; -

我正在寻找一些关于CommonLisp中线程的建议或良好实践。基本上,我正在尝试使用全局变量+时钟+(也设置为线程)同步一些线程。我对连接进程、进程等待、生成互斥锁/生成锁、条件变量等不同的概念有点困惑。 我正在使用ccl和sbcl,所以我可能应该使用,但这只是管理两者的一种方便方法。 简言之,我的代码可以工作,但当我添加一个线程,而不是共享cpu资源时,这个线程将增加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...
最后一个想法是使用+时钟+同步THREADS-SET-1和THREADS-SET-2。
也许在这种情况下是相关的,如果是这样的话,请说明如何在这种情况下使用它。提前感谢您提供的任何帮助或参考书来了解这个主题。

最后,我解决了这个问题,为每个“例程”创建了一个线程,为“时钟”创建了一个线程。然后,3个例程的cpu活动降低到50%左右。
无论如何,如果有人能解释为什么在第一个例子中线程占用了所有的cpu资源,而不是我一个线程一个例程的话,我会很高兴。我怀疑使用进程挂起/恢复而不是互斥。。。接下来的事情!:)

最后我解决了这个问题,为每个“例程”加上一个“时钟”线程。然后,3个例程的cpu活动降低到50%左右。
无论如何,如果有人能解释为什么在第一个例子中线程占用了所有的cpu资源,而不是我一个线程一个例程的话,我会很高兴。我怀疑使用进程挂起/恢复而不是互斥。。。接下来的事情!:)

请注意,当您监视cpu使用情况时,如果您有8个内核,则百分比可能超过100%()ccl:process preset周围有一对太多的括号,这看起来像是一个函数(f)调用,其中包含一些非函数的内容,即f=(ccl:process preset…);括号在LispSorry中是有意义的,这是一个打字错误。我只有2个核心!请注意,当您监视cpu使用情况时,如果您有8个内核,则百分比可能超过100%()ccl:process preset周围有一对太多的括号,这看起来像是一个函数(f)调用,其中包含一些非函数的内容,即f=(ccl:process preset…);括号在LispSorry中是有意义的,这是一个打字错误。我只有2个核心!