如何杀死线程从另一个线程在vala
我有一个主线程,创建另一个线程来执行一些工作。主线程有对该线程的引用。即使线程仍在运行,我如何在一段时间后强制终止该线程。我找不到适当的函数调用。如何杀死线程从另一个线程在vala
任何帮助将是可观的。
我想解决的原始问题是我创建了一个线程来执行CPU绑定操作,可能需要1秒钟才能完成或可能需要10个小时。我无法预测它将花费多少时间。如果花费太多时间,我希望它在我/我想要时优雅地放弃工作。我可以以某种方式将此消息传达给该线程?
假设你正在谈论一个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;
}
这里我们必须检查每个循环中的cancellable.set_error_if_cancelled()以检查它是否已被取消,我可以在新线程开始时执行某些操作,以确保取消时终止它,因为新线程执行没有这种类型的简单循环,我可以检查它..我无法检查这种情况后,每个有意义的代码块。 – imagin 2013-04-26 13:28:46
不可以。为什么你不能在每个有意义的代码块之后检查它?您只需将可取消消息传递给您从线程回调调用的任何方法,并让它们引发异常。然后,它只是一个偶尔的cancellable.set_error_if_cancelled()调用,这不是非常困难。 – nemequ 2013-04-26 19:06:19
也许你问的是错误的问题。与其询问如何杀死一个线程(像glib线程,就像我说过的那样,你不能),也许你应该问如何做一个长时间运行的CPU密集型操作,为此你不能(或者不能) t)修改代码,可取消...在这种情况下,答案将是使用进程而不是线程。 – nemequ 2013-04-26 19:14:08
你为什么要杀死线程?你真的想做什么? – razeh 2013-04-25 16:46:13
我编辑了问题陈述来解释我想要做什么 – imagin 2013-04-25 17:20:33
Appart由于内存泄漏,您将留下大量处于未知状态的数据。这几乎不是一个好主意。指示线程停止,并检查停止请求。 – 2013-04-25 17:28:33