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)))