我在TCL中使用多线程。我正在使用线程扩展创建一个线程。然后我向线程发送一些命令。 我还在各种文件中使用用户定义的一些程序。 我的问题:如何将主线程中的全局变量提供给子线程,不作为参数传递或使用Thread共享变量?
我不知道有多少变量存在,因此想要全部导入
我尝试查找环境共享,但我得到的唯一参考是环境VARIABLES已经共享。我需要整个系统可供子线程使用。
关于图书馆,我可以简单地找到它们。
示例代码
global var1
thread::create {
source <library files >(has dummyProc definition)
<execute some statements>
}
thread::send "dummyProc arg1 arg2...argN" result
我的问题:dummyProc使用主线程中可用的变量(例如var1),而不使用TSV或将它们作为参数传递,因为会有一整套这些全局变量。
答案 0 :(得分:1)
Tcl的线程支持代码是围绕你不这样做的原则设计的;这是非常深刻的假设。每个线程都有自己的解释器;唯一的共享状态是您通过tsv子包显式创建的(这是8.6文档树的一部分,但在早期版本中没有显着差异)。到目前为止,实现线程的最简单方法是将其定义代码放在(普通!).tcl
脚本文件中,并在创建线程时将指令传递给source
,以及任何需要配置的一小部分额外信息,使其成为执行特定任务的特定线程。
这方面的好处?与同类语言相比,Tcl的实现具有更少的大型全局锁。 (它最初由一些在几乎纯粹的Tcl中编写生产级商业Web服务器的人提供。)
那就是说,如果你真的想要克隆一个翻译,那至少要做一些翻译并不难。包可以在另一个解释器中加载,命名空间通常很容易克隆(除了因::oo
而出于各种复杂原因的那些),可以轻松复制过程(info body
,{ {1}}和info args
是必需的工具)和全局/命名空间变量一样(特别是如果你不担心跟踪或保持变量同步)。
其他事情要复杂得多。开放渠道?很难克隆,往往不可能。像TclOO这样的对象图?嗯,比渠道更容易! Tk小部件?别试试;许多其他语言的经验表明,多线程GUI实际上是大脑弯曲。