2015-01-04 32 views
-2

我正在使用add和shift方法在​​sbcl中編寫一個程序來乘以兩個數字。而我的正常程序會很好地運行,但是當我使用線程時,程序顯示沒有輸出並且沒有錯誤消息。我應該刪除代碼中是否有任何錯誤。在sbcl lisp中使用線程時在lisp中變量unbound

(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)) 

爲什麼它是怎麼回事?

+0

您可能想要縮進代碼並將括號放在不同的位置。目前還不清楚爲什麼您將其標記爲'elisp'(Emacs Lisp)或'clisp'(GNU CLISP)。該語言被稱爲Common Lisp。 SBCL是您正在使用的實現。線程在哪裏,示例,錯誤消息? – 2015-01-04 11:34:15

+0

你也可能想正確拼寫'DEFVAR'。 'DEVAR'可能不是你想要寫的。 – 2015-01-04 11:36:21

+0

好的,我已更正拼寫,但它仍未運行。並顯示沒有錯誤。 – 2015-01-04 11:48:46

回答

1

爲了弄清楚發生了什麼,我強烈建議使用(trace writer)(trace reader)(甚至可能是(trace calculator))。

我也會建議使用bordeaux-thread,它只是一個墊片(bordeaux = shim用法語)來使線程在多個實現中工作。