如何杀死线程从另一个线程在vala

问题描述:

我有一个主线程,创建另一个线程来执行一些工作。主线程有对该线程的引用。即使线程仍在运行,我如何在一段时间后强制终止该线程。我找不到适当的函数调用。如何杀死线程从另一个线程在vala

任何帮助将是可观的。

我想解决的原始问题是我创建了一个线程来执行CPU绑定操作,可能需要1秒钟才能完成或可能需要10个小时。我无法预测它将花费多少时间。如果花费太多时间,我希望它在我/我想要时优雅地放弃工作。我可以以某种方式将此消息传达给该线程?

+0

你为什么要杀死线程?你真的想做什么? – razeh 2013-04-25 16:46:13

+0

我编辑了问题陈述来解释我想要做什么 – imagin 2013-04-25 17:20:33

+0

Appart由于内存泄漏,您将留下大量处于未知状态的数据。这几乎不是一个好主意。指示线程停止,并检查停止请求。 – 2013-04-25 17:28:33

假设你正在谈论一个GLib.Thread,你不能。即使你可以,你可能也不想,因为你可能最终会泄漏大量的内存。

你应该做的是要求线程自己杀死。一般来说,这是通过使用变量来指示是否已请求操作尽早停止。 GLib.Cancellable专为此目的而设计,它与GIO中的I/O操作集成在一起。

例子:

private static int main (string[] args) { 
    GLib.Cancellable cancellable = new GLib.Cancellable(); 
    new GLib.Thread<int> (null,() => { 
     try { 
     for (int i = 0 ; i < 16 ; i++) { 
      cancellable.set_error_if_cancelled(); 
      GLib.debug ("%d", i); 
      GLib.Thread.usleep ((ulong) GLib.TimeSpan.MILLISECOND * 100); 
     } 

     return 0; 
     } catch (GLib.Error e) { 
     GLib.warning (e.message); 
     return -1; 
     } 
    }); 

    GLib.Thread.usleep ((ulong) GLib.TimeSpan.SECOND); 
    cancellable.cancel(); 

    /* Make sure the thread has some time to cancel. In an application 
    * with a UI you probably wouldn't need to do this artificially, 
    * since the entire application probably wouldn't exit immediately 
    * after cancelling the thread (otherwise why bother cancelling the 
    * thread? Just exit the program) */ 
    GLib.Thread.usleep ((ulong) GLib.TimeSpan.MILLISECOND * 150); 

    return 0; 
} 
+0

这里我们必须检查每个循环中的cancellable.set_error_if_cancelled()以检查它是否已被取消,我可以在新线程开始时执行某些操作,以确保取消时终止它,因为新线程执行没有这种类型的简单循环,我可以检查它..我无法检查这种情况后,每个有意义的代码块。 – imagin 2013-04-26 13:28:46

+0

不可以。为什么你不能在每个有意义的代码块之后检查它?您只需将可取消消息传递给您从线程回调调用的任何方法,并让它们引发异常。然后,它只是一个偶尔的cancellable.set_error_if_cancelled()调用,这不是非常困难。 – nemequ 2013-04-26 19:06:19

+1

也许你问的是错误的问题。与其询问如何杀死一个线程(像glib线程,就像我说过的那样,你不能),也许你应该问如何做一个长时间运行的CPU密集型操作,为此你不能(或者不能) t)修改代码,可取消...在这种情况下,答案将是使用进程而不是线程。 – nemequ 2013-04-26 19:14:08