2015-01-04 2 views
-2

sbcl에 프로그램을 작성하여 추가 및 시프트 방법을 사용하여 두 개의 숫자를 곱합니다. 내 정상적인 프로그램을 잘 실행되지만 스레드를 사용할 때 프로그램이 출력 및 오류 메시지를 표시합니다. 내가 제거해야하는 코드에 실수가 있습니까? 왜 무슨 일이 일어나고sbcl lisp에서 스레딩을 사용할 때 lisp에서 변수가 언 바운드 됨

(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은 사용중인 구현입니다. 스레드, 예제, 오류 메시지는 어디에 있습니까? –

+0

'DEFVAR'을 올바르게 입력하고 싶을 수도 있습니다. 'DEVAR'은 아마도 당신이 쓴 것을 원하지 않을 것입니다. –

+0

오케이, 철자를 수정했지만 아직 실행되지 않습니다. 그리고 아무런 오류도 보이지 않습니다. –

답변

1

무엇이 일어나고 있는지 알아 보려면 (trace writer)(trace reader) (아마도 심지어 (trace calculator))을 사용하는 것이 좋습니다.

또한 여러 구현에서 스레딩 작업을 만들기 위해 단순히 shim (bordeaux = shim french) 인 bordeaux-thread를 사용하는 것이 좋습니다.