Concurrency 如何传递当前线程';绑定到另一个线程?

Concurrency 如何传递当前线程';绑定到另一个线程?,concurrency,common-lisp,sbcl,dynamic-variables,Concurrency,Common Lisp,Sbcl,Dynamic Variables,如何将当前线程的所有绑定传递到另一个线程?具体来说,我需要以下代码片段将2(而不是1)打印到标准输出: (defvar *foo* 1) (let ((*foo* 2)) (bordeaux-threads:make-thread (lambda () (print *foo*)))) ;; prints 1 当然,我可以手动复制*foo*的值,如下所示: (let ((*foo* 2)) (bordeaux-threads:make-thread (let ((foo-bin

如何将当前线程的所有绑定传递到另一个线程?具体来说,我需要以下代码片段将
2
(而不是
1
)打印到标准输出:

(defvar *foo* 1)

(let ((*foo* 2))
  (bordeaux-threads:make-thread (lambda () (print *foo*)))) ;; prints 1
当然,我可以手动复制
*foo*
的值,如下所示:

(let ((*foo* 2))
  (bordeaux-threads:make-thread
   (let ((foo-binding *foo*))
     (lambda () 
       (let ((*foo* foo-binding))
         (print *foo*)))))) ;; prints 2
但是,有什么东西可以允许一次复制所有这些文件吗

关于变量共享的定义是明确的:

线程和动态变量之间的交互在某种程度上是相互作用的 案例很复杂,这取决于变量是否只有全局变量 绑定(由例如DEFVAR/DEFPARAMETER/top level SETQ建立)或 已在调用线程中本地绑定(例如,使用LET或LET*)

一,

全局绑定在线程之间共享:新线程中全局变量的初始值将与父线程中的相同, 在任何线程中,对这样一个变量的赋值都是可见的 全局绑定可见的所有线程

二,

本地绑定是它们引入的线程的本地绑定, 除了

三,

MAKE-THREAD调用方中的本地绑定可能与它创建的新线程共享,也可能不共享:这是 实现定义。可移植代码不应依赖于特定的 在这种情况下,也不应在没有 首先在新线程中重新绑定它们。

因此,使绑定全局而非局部似乎是最简单(不依赖于实现)的方法

@coredump还建议签出
*默认特殊绑定*
列表以获取可能的共享方法:

此变量包含将特殊变量符号与关联的列表 用于计算绑定值的窗体。此字段中命名的特殊变量 列表将在新线程开始之前在本地绑定 正在执行用户代码

这个变量可能是通过调用MAKE-THREAD来添加/更改的 默认绑定。改变此列表的效果尚未定义,但是 对于同一符号,较早的形式优先于较晚的形式,因此 默认值可以通过考虑列表的标题来覆盖

表单在新线程或调用线程中求值? 此列表的标准内容:打印/读卡器控件等可以借用 弗兰兹等价物


另请参见关于
*默认特殊绑定*
*默认特殊绑定*
的说明,这是一种简单的方法。退回到全局的、有效的非特殊行为似乎是不可取的。您确定如果要更改主线程中的变量会更容易吗?我通常确信根本不更改全局变量会更容易(相对于动态重新绑定)。如果你需要线程之间的通信(或进程之间的通信,或其他什么),请使用通道/邮箱/套接字/队列/其他任何东西。我不是说从系统设计的角度来看,我指的是“只为我”的快速而肮脏的小应用程序。但我明白你的意思,我会再加上一点警告。