0

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

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

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

关于图书馆,我可以简单地获取它们。

示例代码

global var1

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

thread::send "dummyProc arg1 arg2...argN" result

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

4

1 回答 1

1

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

这样做的好处是什么?Tcl 的实现具有比同类语言少得多的大全局锁。(它最初是由一些用几乎纯 Tcl 编写生产级商业 Web 服务器的人贡献的。)


也就是说,如果你真的想克隆一个解释器,至少做一些并不难。包可以在其他解释器中加载,命名空间通常很容易克隆(除了那些由于::oo各种复杂原因而成为子级的名称),过程可以像全局一样轻松复制(info body并且info argsinfo default所需的工具) /namespace 变量(特别是如果您不担心跟踪或保持变量同步)。

其他事情要棘手得多。开通渠道?很难克隆,通常是不可能的。TclOO 之类的对象图?好吧,比频道更容易!TK 小部件?不要尝试;其他语言的大量经验表明,多线程 GUI 实际上是令人费解的。

于 2013-05-11T01:05:36.707 回答