在Tcl中,来自需要Expect的多个线程的seg故障

时间:2010-06-26 08:11:19

标签: multithreading tcl expect

现在这里有一些有趣的东西。当我在Tcl中调用package require Expect时有多个线程时,我遇到了一个seg错误。

e.g。

package require Threads  
package require Expect

set t [thread::create]

thread::send {package require Expect}

puts "blarg! Damned thing crashes before I get here"

这不是个好时机。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

Expect和Threads不能很好地融合在一起。它从fork()+线程中获得的复杂性可以在那里咬很多并导致死锁和各种丑陋。将两者结合起来通常不是一个好主意。

如果你真的需要Expect和增加的并发性,多进程驱动程序和一个单线程期望进程的多进程方法可能会更好。如果你使用了tcllibs comm package,发送命令的api也没那么大(如果你使用comm,你通常会错过tsv和tpool的东西)。

但它肯定不应该是段落错误。您使用了哪些Expect / Threads / Tcl核心组合(例如ActiveStates ActiveTcl软件包或一些不寻常的平台上的自编译内容?)

答案 1 :(得分:0)

全部来自最新的debian软件包,Ubuntu 9.0.4,64位。

一种替代方法是组织代码,使得一个线程专用于处理所有期望调用...这不是最优雅的通​​用解决方案,但它可能必须这样做。

答案 2 :(得分:0)

expect库的C代码(加载package require Expect)不是线程安全的(它可能使用全局变量或其他)。我尝试了很多来解决这个限制,因为我希望有一个基于Thread库的负载平衡算法,该算法可以在一些从属机器上引导一些预期的代码启动构建。除非你非常擅长C并希望提高期望,否则我建议每次需要从支持Thread的程序中使用它时,启动期望解释器(在他们自己的OS过程中)。但当然我不知道你要解决的问题,这只有在“期望工作”无关的情况下才有效。无论如何,祝你好运..