Multithreading 如何在TCL中为子线程获得相同的环境?

Multithreading 如何在TCL中为子线程获得相同的环境?,multithreading,tcl,environment,Multithreading,Tcl,Environment,我在TCL中使用多线程。我正在使用线程扩展创建一个线程。然后我向线程发送一些命令。 我还在各种文件中使用用户定义的一些过程。 我的问题:如何使主线程中的全局变量可用于子线程,而不作为参数传递或使用线程共享变量 我不知道这些变量中有多少,因此我想把它们全部导入 我尝试查找环境共享,但我得到的唯一参考是环境变量已经共享。我需要整个系统对子线程可用 关于图书馆,我可以简单地找到它们的来源 示例代码 global var1 thread::create { source <library fil

我在TCL中使用多线程。我正在使用线程扩展创建一个线程。然后我向线程发送一些命令。 我还在各种文件中使用用户定义的一些过程。 我的问题:如何使主线程中的全局变量可用于子线程,而不作为参数传递或使用线程共享变量

我不知道这些变量中有多少,因此我想把它们全部导入

我尝试查找环境共享,但我得到的唯一参考是环境变量已经共享。我需要整个系统对子线程可用

关于图书馆,我可以简单地找到它们的来源

示例代码

global var1

thread::create {
source <library files >(has dummyProc definition)
<execute some statements>
}

thread::send "dummyProc arg1 arg2...argN" result
global var1
线程::创建{
源(具有dummyProc定义)
}
线程::发送“dummyProc arg1 arg2…argN”结果

我的问题是:dummyProc使用主线程中可用的变量(例如var1),而不使用TSV或将它们作为参数传递,因为会有一整套全局变量。

Tcl的线程支持代码是围绕不这样做的原则设计的;这是一个非常深刻的假设。每个线程都有自己的解释器;唯一的共享状态是通过子包显式创建的状态(这是8.6文档树的一部分,但在早期版本中没有明显不同)。到目前为止,实现线程最简单的方法是将其定义代码放入(普通!)
.tcl
脚本文件中,并在创建线程时将指令传递给
source
它,以及需要配置的任何少量额外信息,以使其成为执行特定任务的特定线程

这有什么好处?Tcl实现的大型全局锁比同类语言少得多。(它最初是由一些在几乎纯Tcl中编写生产级商业web服务器的人提供的。)


也就是说,如果你真的想克隆一个解释器,至少要克隆一部分并不难。包可以加载到另一个解释器中,名称空间通常很容易克隆(由于各种复杂原因属于
::oo
的子空间除外),过程可以轻松复制(
info body
info args
info default
是这方面所需的工具)全局/命名空间变量也是如此(特别是如果您不担心跟踪或保持变量同步)


其他事情要复杂得多。开放频道?很难克隆,通常是不可能的。TclOO之类的对象图?嗯,比频道容易!Tk小部件?不要尝试;在其他语言中的大量经验表明,多线程GUI实际上是一种大脑弯曲现象。

请在原始问题中说明您的意图。这样的代码很难读懂。这听起来有点像是你试图将通用的“共享状态”线程概念强加给Tcl的“消息传递”样式的线程,这是一种不匹配的做法。虽然通过变量跟踪和其他技巧(例如重命名“set”并将其替换为查询另一个线程中任何请求的变量的特殊版本)可以实现您想要的功能,但这可能不是一个好主意。为什么需要允许在一个线程中访问整个环境?非常感谢!我现在编辑了原始问题,包括代码,希望能更好地理解。然而,我现在已经转向一种不同的方法来解决我原来的问题,切换前台和后台进程,并且发送到子线程的新命令需要最小的变量和开销。但是我现在遇到了另一个问题,子线程中的“Expect”会使tclsh崩溃,
包要求Expect在主线程中工作时也会崩溃。在这方面的任何帮助都将不胜感激!我也会把它作为一个单独的问题发布。谢谢嗨,这是问题,已经在stackoverflow上,您已经回答了。现在有什么解决办法吗?我在windows计算机上使用8.5.x。很高兴知道。如何将包含大量内容(包括换行符、引号等)的变量“发送”到线程?我总是惹麻烦(引用地狱的话)?有没有一种简单的方法可以将变量克隆到线程中?