multithreading - 在 sbcl lisp 中使用线程时,变量在 lisp 中未绑定(bind)

标签 multithreading lisp common-lisp sbcl

我正在 sbcl 中编写一个程序,使用加法和移位法将两个数字相乘。虽然我的普通程序可以很好地运行,但是当我使用线程时,程序没有输出也没有错误消息。代码中是否有我应该删除的错误。

(use-package :sb-thread)
(defvar *buffer-queue* (make-waitqueue))
(defvar *buffer-lock* (make-mutex :name "buffer-lock"))
(defvar *buffer* (list nil))

(defun writer()
    (let ((res 0))
        (loop for lpr from 0 to 63
              do (let ((end-bit (logand num2 1)))
                (with-mutex (*buffer-lock*)
                    (setf *buffer* (cons end-bit *buffer*))
                    (setq num2 (ash num2 -1))
                    (condition-notify *buffer-queue*)
                )))))

(defun reader()
    (let ((end-bit 0) (res 0))
    (with-mutex (*buffer-lock*)
        (loop
        (condition-wait *buffer-queue* *buffer-lock*)
            (loop
                (unless *buffer* (return))
                (end-bit (car *buffer*))
                (setf *buffer* (cdr *buffer*)))))
    (if (= end-bit 1)
                   (setq res (+ res num1)))
        (setq num1 (ash num1 1))
        (format t "result is ~a.~%" res)
    )
)





(let ((num1 (progn
              (write-line "Enter first number: ")
              (finish-output)
              (read)))
      (num2 (progn
              (write-line "Enter second number: ")
              (finish-output)
              (read))))
  (if (or (= num1 0) (= num2 0))
      (write-line "result is 0.0")
      (calculator num1 num2))

)

为什么会这样?

最佳答案

为了弄清楚发生了什么,我强烈建议使用 (trace writer)(trace reader)(甚至可能是 (trace calculator)).

我还建议使用 bordeaux-thread,它只是一个 shim(法语中的 bordeaux = shim),使线程可以在多个实现上工作。

关于multithreading - 在 sbcl lisp 中使用线程时,变量在 lisp 中未绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27764517/

相关文章:

java - 使用java从套接字流读取多个流?

arrays - 普通口齿不清 : value 16777216 is not of the expected type (UNSIGNED-BYTE 24)

java - 线程同步,使用notifyAll()

java - 多线程环境下迭代集合: ConcurrentModificationException

emacs - 如何在 paredit 中用已经写好的外部形式包装形式

lisp - 什么是 Lisp 图像?

sorting - 在交换过程中无法获得我想要的最终列表

lisp - 读者级别的 Common Lisp 调试

list - lisp 中列表元素的两个元素组合(没有重复项)

java - ForkJoinPool - 为什么程序抛出 OutOfMemoryError?