Multithreading sbcl中的多线程

Multithreading sbcl中的多线程,multithreading,lisp,common-lisp,sbcl,Multithreading,Lisp,Common Lisp,Sbcl,我是lisp编程的新手。我正在使用sbcl。在程序的一部分中,线程被创建为- (sb-thread:make-thread (lambda () (progn (sleep 0) (setf c (+ a b)) (print "ADDITION:") (print c)))) 我不明白lambda()和progn(sleep 0)做了什么,以及为什么它写在sb线程括号内?sb线程:使线程使用函数调用新创建的线程 (lambda ()

我是lisp编程的新手。我正在使用sbcl。在程序的一部分中,线程被创建为-

(sb-thread:make-thread
  (lambda ()
    (progn
      (sleep 0)
      (setf c (+ a b))
      (print "ADDITION:")
      (print c))))

我不明白
lambda()
progn(sleep 0)
做了什么,以及为什么它写在
sb线程
括号内?

sb线程:使线程
使用函数调用新创建的线程

(lambda ()
   (progn
      (sleep 0)
      (setf c (+ a b))
      (print "ADDITION")
      (print c)))

是一个匿名函数。反过来,
progn
创建一个程序块(在这种情况下不一定,因为lambda主体是一个隐式的progn),并且
(sleep 0)
可能被用作“请在此处调用调度程序”(它本质上是一个no op,休眠0秒)。

我建议您使用REPL,使用Lisp代码进行实验是最好的学习方法,对于您的代码,如果您使用SBCL,我建议您使用slime进行开发

我建议您在REPL上试用此选项:

; first define the parameters that you will use inside the tread
CL-USER> (defparameter a 3)
A
CL-USER> (defparameter b 4)
B
CL-USER> (sb-thread:make-thread
  (lambda ()
    (progn
      (sleep 0)
      (setf c (+ a b))
      (print "ADDITION:")
      (print c))))
; 
; caught WARNING:
;   undefined variable: C
; 
; compilation unit finished
;   Undefined variable:
;     C
;   caught 1 WARNING condition
#<SB-THREAD:THREAD RUNNING {1003CD34A3}>

; put the tread inside a lisp variable like this
CL-USER> (defparameter my-thread (sb-thread:make-thread
  (lambda ()
    (progn
      (sleep 0)
      (setf c (+ a b))
      (print "ADDITION:")
      (print c)))))

; in: DEFPARAMETER MY-THREAD
;     (SETF C (+ A B))
; ==>
;   (SETQ C (+ A B))
; 
; caught WARNING:
;   undefined variable: C
; 
; compilation unit finished
;   Undefined variable:
;     C
;   caught 1 WARNING condition
MY-THREAD
; the REPL says you that the variable C is unbound for this if you want you may initialize it
CL-USER> (sb-thread:join-thread my-thread )
7
CL-USER> 
;首先定义将在踏步内使用的参数
CL-USER>(定义参数a 3)
A.
CL-USER>(定义参数b 4)
B
CL-USER>(sb线程:生成线程
(lambda()
(项目
(睡眠0)
(setf c(+a b))
(打印“添加:”)
(丙)
; 
; 捕获警告:
;   未定义变量:C
; 
; 编译单元已完成
;   未定义变量:
;     C
;   捕获1个警告条件
#
; 将踏板放在lisp变量中,如下所示
CL-USER>(定义参数my thread(sb thread:make thread
(lambda()
(项目
(睡眠0)
(setf c(+a b))
(打印“添加:”)
(打印c(()))
; in:DEFPARAMETER MY-THREAD
;     (SETF C(+A B))
; ==>
;   (SETQ C(+A B))
; 
; 捕获警告:
;   未定义变量:C
; 
; 编译单元已完成
;   未定义变量:
;     C
;   捕获1个警告条件
我的线
; REPL告诉您,变量C对此是未绑定的,如果需要,您可以初始化它
CL-USER>(sb线程:加入线程我的线程)
7.
CL-USER>
在您的问题上,函数(sleep n)使当前线程休眠,或者在您的情况下停止工作n秒(0秒)

Lambda来自Lambda calulus,是一种定义没有名称的函数的方法,当您需要将一个简单而简短的函数作为参数传递时,它非常适合这样做

最后,progn是一种lisp特殊形式,允许您执行几个常见的lisp表达式并返回最后一个表达式的结果

我还想让你检查一下这里的基本情况