现在这里有一些有趣的东西。当我在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"
这不是个好时机。有什么想法吗?
答案 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过程中)。但当然我不知道你要解决的问题,这只有在“期望工作”无关的情况下才有效。无论如何,祝你好运..