【问题标题】:How do I get the same environment for a child thread in TCL?如何在 TCL 中为子线程获得相同的环境?
【发布时间】:2013-05-10 11:01:09
【问题描述】:

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

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

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

关于库,我可以简单地获取它们。

示例代码

global var1

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

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

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

【问题讨论】:

  • 请把你想要做的事情放在你原来的问题中。这样的代码很难阅读。
  • 这听起来有点像您试图将常见的“共享状态”线程概念强加到 Tcl 的“消息传递”样式线程上,这是不匹配的。虽然借助变量跟踪和其他技巧(例如,通过重命名“set”并将其替换为特殊版本来查询另一个线程以获取任何请求的变量),这可能是可能的,但这可能是一个坏事主意。为什么需要允许在一个线程中访问整个环境?

标签: multithreading tcl environment


【解决方案1】:

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

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


也就是说,如果你真的想克隆一个解释器,至少做一些并不太难。包可以在另一个解释器中加载,命名空间通常很容易克隆(除了那些由于各种复杂原因是::oo 的子级的除外),可以轻松复制过程(info bodyinfo args 和 @ 987654328@ 是必需的工具)以及全局/命名空间变量(特别是如果您不担心跟踪或保持变量同步)。

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

【讨论】:

  • 非常感谢!我现在已经编辑了原始问题,包括代码,希望能更好地理解。然而,我现在已经转向了一种不同的方法来解决我原来的问题,切换了前台和后台进程,并且要发送到子线程的新命令需要最少的变量和开销。但是我现在遇到了一个不同的问题,子线程中的“期望”使 tclsh 崩溃,package require Expect 也是如此,而它在主线程中工作。在这方面的任何帮助将不胜感激!我也会将其作为一个单独的问题发布。谢谢!
  • 嗨,这是问题,已经在stackoverflow上,你已经回答了。现在有什么解决办法吗?我在 Windows 机器上使用 8.5.x。 stackoverflow.com/questions/3123195/…
  • 很高兴知道这一点。如何将包含大量内容(包括换行符、引号等)的变量“发送”到线程?我总是惹麻烦(引用地狱)?有没有一种简单的方法可以将变量克隆到线程中?
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2016-10-01
  • 2021-12-19
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多