Multithreading 在sbcl lisp中使用线程时,lisp中的变量未绑定

Multithreading 在sbcl lisp中使用线程时,lisp中的变量未绑定,multithreading,lisp,common-lisp,sbcl,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(

我正在用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))
)


为什么会发生这种情况?

为了弄清发生了什么,我强烈建议使用
(跟踪编写器)
(跟踪阅读器)
(甚至可能
(跟踪计算器)


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

您可能希望缩进代码并以不同的方式放置括号。也不清楚为什么要将其标记为“elisp”(Emacs Lisp)或“clisp”(GNU clisp)。这种语言称为公共Lisp。SBCL是您正在使用的实现。例如,错误消息的线程在哪里?您可能还希望正确拼写
DEFVAR
DEVAR
可能不是您想要编写的。好的,我已经更正了拼写,但它仍然没有运行。并且没有显示错误。在显示的代码中,您从不使用
writer
reader
,而且
计算器
似乎也在其他地方定义过(我猜将
结束位
作为函数调用只是一个错误)。如果没有看到错误,则这不是完整的示例。