Tcl/Tk: Thread (多线程)

风行水上 @ 2010-06-06 22:38:38
标签:

Thread(线程)是程序设计中用来处理并行任务的手段之一。比如在处理大量数据的同时,要保持用户界面(GUI)的正常响应,就可以考虑使用 Thread。当然 Thread 不是唯一的方法。

Tcl 中的 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 的作用

thread::wait 使得创建的线程进入事件循环(event loop)状态,从而可以响应事件。否则创建的线程在执行完初始化动作后就相当于结束了。thread::wait 在创建线程时通常是最后一条命令。

thread::release & thread::release

要退出某个线程,可以使用命令 thread::release $ID 结束指定的线程。如果省略参数 $ID 的话,则为当前进程。

还有一个命令 thread::exit 可以用于结束当前线程。thread::exit 不可以用于结束其他线程。

应当优先考虑使用 thread::release 来结束某个线程。

参考资源

标签:

分享到:
comments powered by Disqus

21/23ms