Multithreading 通过引用传递TCL-线程?

Multithreading 通过引用传递TCL-线程?,multithreading,tcl,Multithreading,Tcl,我和TCL一起使用零食音频处理工具包。 我想切掉声音的一部分,把这一部分交给另一个线程来处理 我的问题是如何在TCL中的线程之间通过引用传递内容 proc a {} { snack::sound snd thread::send -async $Thread [list B snd] } set Thread [thead::create { proc B{snd} { ... do something with snd } } 那是行不通

我和TCL一起使用零食音频处理工具包。 我想切掉声音的一部分,把这一部分交给另一个线程来处理

我的问题是如何在TCL中的线程之间通过引用传递内容

proc a {} {  
    snack::sound snd  
    thread::send -async $Thread [list B snd]
}

set Thread [thead::create { 
    proc B{snd} { 
    ... do something with snd
    }
}

那是行不通的。Tcl线程被设计为彼此之间的强隔离,因为它大大减少了正常处理所需的锁定量。缺点是,在线程之间传递东西是不平凡的(除了包含命令的短消息,音频数据不是!),但有一个前进的方向

如果您可以以字节块的形式发送数据(在脚本级别),那么我建议使用在线程之间传输数据,它与线程包一起打包,这样您就已经拥有了数据。这将使您可以相对简单地在线程之间传输数据。请注意,snack包在其脚本级界面中不支持线程,因此数据传输仍将涉及复制,而Tk(像许多GUI工具包一样,FWIW)不支持多线程使用(好吧,下次也不能没有技术),因此如果您正在进行波形可视化,那么您还有一些工作要做。(OTOH,现代CPU也有大量的空闲时间。)