2010-06-26 35 views
0

現在,這裏有一些有趣的事情。當我在Tcl中有多個線程調用package require Expect時,我得到一個seg錯誤。在Tcl中,來自多個線程的seg故障需要Expect

例如

package require Threads 
package require Expect 

set t [thread::create] 

thread::send {package require Expect} 

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

這不是一個好時機。有什麼想法嗎?

回答

2

期望值和線程不會很好地結合在一起。它從fork()+線程中獲得的複雜性可能會在這裏引起很多麻煩,並導致死鎖和各種醜陋。通常將兩者結合起來不是一個好主意。

如果您確實需要Expect和增加的併發性,多線程驅動程序和單線程期望進程的多進程方法可能會更好。如果你使用tcllibs comm包,那麼發送命令的api也沒有太大差別(如果你使用comm,你大多會錯過tsv和tpool的東西)。

但它不應該segfault肯定。你使用了哪些Expect/Threads/Tcl核心組合(例如ActiveStates ActiveTcl捆綁軟件或一些不尋常的平臺上的自我編譯的東西?)

0

這些都來自最新的debian軟件包,Ubuntu 9.0.4,64位。

一種替代方法是組織代碼,使一個線程致力於處理所有期望的調用...這不是最優雅的通​​用解決方案,但它可能需要做。

0

期望庫(加載了package require Expect)的C代碼不是線程安全的(它可能使用全局變量或其他)。我嘗試了很多工作來解決這個限制,因爲我想有一個基於Thread庫的負載均衡算法,它可以試驗一些期望代碼啓動構建在一個從機池上的構建。除非你非常擅長C並希望提高期望,否則每次需要使用啓用線程的程序時,我都會建議啓動期望的解釋器(在他們自己的操作系統進程中)。但當然,我不知道你的問題要解決,而這隻會在「期望工程」無關時起作用。無論如何,祝你好運..