Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 波尔多线程:如何杀死线程?_Multithreading_Lisp_Common Lisp - Fatal编程技术网

Multithreading 波尔多线程:如何杀死线程?

Multithreading 波尔多线程:如何杀死线程?,multithreading,lisp,common-lisp,Multithreading,Lisp,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”)--> 在杀死线程之前,最好先检查线程是否处于活动状态,(bt:thread-alive-p)而不是当前线程,(bt:current thread)。可以杀

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

我怎样才能杀死任何我能用
(bt:all threads)

(bt:make thread(lambda()(loop)):name“Foo”)
-->


在杀死线程之前,最好先检查线程是否处于活动状态,
(bt:thread-alive-p)
而不是当前线程,
(bt:current thread)

可以杀死任何线程。这没什么特别的。如果您得到一个线程列表,只需获取您想要终止的线程并将其传递给函数即可

函数
destroy thread
没有看到变量。由于它是一个函数,Lisp使用常用的求值规则。它通过了一个线程。线程恰好是示例中变量的值

它可以是函数调用的值:

(defun my-thread ()
  *foo*)

(bt:destroy-thread (my-thread))
甚至是数据结构的一部分,例如列表:

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

(bt:destroy-thread (second (my-thread)))
线程只是另一个对象


如果您得到一个线程列表,那么您需要识别正确的线程。例如,通过查看线程的名称。

谢谢!我确信我试过
(bt:destroy thread#)
,但我显然弄错了。@Pascal您不能将其作为输入键入。任何看起来像#的东西都是不可读的。它是为一个对象打印的,但无法读回。你需要访问数据结构并传递结果。在阅读你的答案后,复制文本只工作了一次,但我不确定这取决于什么。当它工作时,它的颜色保持红色,就像
(bt:all threads)
的输出一样,所以我猜它是对象,而不仅仅是文本。不管怎么说,我不打算继续这样做。但我很高兴我并不是梦见我尝试了那个但没有成功。@Pascal:这只是你的IDE(Slime,我猜)中的一些魔法。@Rainer,在调用destroy thread之后,我看到线程非常活跃并且运行良好。它需要几分之一秒的时间才能美丽地死去。示例代码(最好将其复制粘贴到emacs中):
(let((线程(bt:make-thread)(lambda()(loop(sleep 0.1)))(bt:destroy-thread-alive-p-thread)(打印(bt:thread-alive-p-thread))(打印(bt:thread-alive-p-thread)))
我猜destroy线程只发送一个kill信号,但它不会等待线程死亡后再返回。有什么建议吗?谢谢!我这样问主要是因为我正在尝试从Lispworks移植到波尔多线程,添加如何筛选线程列表可能是个好主意。在代码中(与调试和/或REPL相反),您应该通知线程优雅地退出,而不是终止它。谢谢!我这样问是因为在公共Lisp烹饪书中有一部分是关于的,我正在尝试将这一章从Lispworks特定代码移植到波尔多线程。我知道杀戮只是最后的手段,但也许我应该把它添加到文档中。@Pascal
(从name(name)(find name(bt:all threads):key#'bt:thread name:test#'string=)可以派上用场。
请记住,安全地杀戮线程几乎是不可能的,因为数据可能处于不一致的状态。最好的解决方案是以某种方式通知线程它需要终止,然后让它自己退出。
(defun my-thread ()
  (list 1 *foo* 3))

(bt:destroy-thread (second (my-thread)))