无法跨tcl中的线程获取文件处理程序

时间:2014-04-19 10:42:50

标签: tcl

有没有办法解决以下线程相关的问题?

  1. 在主要部分(还没有线程)中,我们正在寻找大量文件,其中一个文件是一个带有itcl类和对象定义的.tcl文件。
  2. 在itcl类中,打开一个文件,并将其句柄存储在变量中。
  3. 我正在创建多个线程,并希望使用相同的句柄使用相同的文件。
  4. 可以使用tsv :: set和tsv :: get命令跨线程传递句柄的变量名。但是,这样的句柄不会传递给线程。它说"未找到频道"错误。
  5. 你能不能帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

虽然您可以使用thread::transfer 移动线程之间的通道,但您不能同时在多个线程中使用相同的通道(请不要移动服务器套接字);有没有 thread::copy_channel。 (想一想:如果你在两个线程中有相同的通道,并且两个都有可读的事件处理程序设置,当通道可读时会发生什么?有一个竞争条件。可写通道存在同样的问题,尽管大多数代码没有注意到,因为Tcl的默认行为通常是足够好的。)

使用thread::transfer,在源线程中执行:

thread::transfer $targetThreadID $channel

在目标线程中,在源中的上述代码发生之后,您可以正常访问该通道。假设您在线程的最顶级主解释器中(子解释器通过interp正常管理)。在实践中,您通常在传输后在源线程中执行thread::sendthread::eval,以告诉目标的Tcl脚本他们现在负责解释器。


对于日志记录,让一个线程管理日志文件,其他线程只是向记录器线程发送消息以将其写出。在每个线程中隐藏记录器对象(一个线程中的“真实”,其他线程中的“线程感知代理”)中的详细信息,以便代码中的任何其他内容都不知道您要做什么。