Bordeaux-Threads:如何杀死一个线程?

Pas*_*cal 3 lisp multithreading common-lisp

我只找到了如何杀死我分配给变量的线程:
(setf *foo* (bt:make-thread (lambda () (loop)) :name "Foo2"))- >(bt:destroy-thread *foo*)

我怎么能杀死我能看到的任何线程(bt:all-threads):
(bt:make-thread (lambda () (loop)) :name "Foo")- >?

Rai*_*wig 8

你可以杀死任何线程.没什么特别的.如果你得到一个线程列表,只需获取你要杀死的线程并将其传递给该函数.

该函数destroy-thread没有看到变量.由于它是一个函数,Lisp使用通常的评估规则.它传递了一个线程.线程恰好是示例中变量的值.

它可能是函数调用的值:

(defun my-thread ()
  *foo*)

(bt:destroy-thread (my-thread))
Run Code Online (Sandbox Code Playgroud)

甚至是数据结构的一部分,例如列表:

(defun my-thread ()
  (list 1 *foo* 3))

(bt:destroy-thread (second (my-thread)))
Run Code Online (Sandbox Code Playgroud)

线程只是另一个对象.

如果获得线程列表,则需要确定正确的线程.例如,通过查看线程的名称.


Pue*_*Pop 7

(bt:destroy-thread (nth index (bt:all-threads)))
Run Code Online (Sandbox Code Playgroud)

检查线程是否存活可能是好的,(bt:thread-alive-p <thread>)而不是当前线程,(bt:current-thread <thread>)在杀死它之前.

  • 谢谢!我问的主要是因为我试图将[Common Lisp Cookbook - Threads](http://lispcookbook.github.io/cl-cookbook/process.html)从Lispworks移植到Bordeaux-Threads,并添加如何过滤线程列表可能是一个好主意. (2认同)