Thread(线程)是程序设计中用来处理并行任务的手段之一。比如在处理大量数据的同时,要保持用户界面(GUI)的正常响应,就可以考虑使用 Thread。当然 Thread 不是唯一的方法。
Tcl 允许创建多个解释器(interpreter),每个 interpreter就分别对应一个 thread。使用 thread 时一个很重要的问题是线程间的通信,或者说不同线程间的资源(数据)共享。
Tcl 提供了一些和线程相关的C API,但并没有直接提供 script 层面的相关命令。在脚本层面使用线程的话,可以使用扩展包 Tthread 。
实际运用中经常需要在不同的线程间共享 procedure,扩展包 Ttrace 提供了这方面的帮助。
听起来也许有点复杂,但基本用法还是比较简单的。下面的例子基本上就包含了最经常的用法。
package require Tthread package require Ttrace set t1 [thread::create { package require Ttrace thread::wait }] ttrace::eval { proc test {args} { puts test-[thread::id] } } thread::send $t1 test set t2 [thread::create { package require Ttrace thread::wait }] thread::send $t2 test
thread::wait 使得创建的线程进入事件循环(event loop)状态,从而可以响应事件。否则创建的线程在执行完初始化动作后就相当于结束了。thread::wait 在创建线程时通常是最后一条命令。
要退出某个线程,可以使用命令 thread::release $ID 结束指定的线程。如果省略参数 $ID 的话,则为当前进程。
还有一个命令 thread::exit 可以用于结束当前线程。thread::exit 不可以用于结束其他线程。
应当优先考虑使用 thread::release 来结束某个线程。