【发布时间】:2015-01-04 10:20:21
【问题描述】:
我正在 sbcl 中编写一个程序,使用 add 和 shift 方法将两个数字相乘。虽然我的正常程序可以很好地运行,但是当我使用线程时,程序没有显示输出,也没有错误消息。代码中是否有我应该删除的错误。
(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))
)
为什么会这样?
【问题讨论】:
-
您可能希望缩进代码并以不同的方式放置括号。也不清楚为什么将其标记为“elisp”(Emacs Lisp)或“clisp”(GNU CLISP)。该语言称为 Common Lisp。 SBCL 是您正在使用的实现。线程,例如,错误消息在哪里?
-
您可能还想正确拼写
DEFVAR。DEVAR可能不是你想写的。 -
好的,我已经更正了拼写,但它仍然没有运行。并且没有显示错误。
-
您在显示的代码中从不使用
writer或reader,而且calculator似乎也在其他地方定义(我猜将end-bit作为函数调用是一个错误)。如果您没有看到错误,这不是完整的示例。
标签: multithreading lisp common-lisp sbcl