我有一个主线程,它创建另一个线程来执行某些工作。 主线程有一个对该线程的引用。一段时间后,即使线程仍在运行,如何强制终止该线程。我无法找到一个正确的函数调用。
任何帮助都会很明显。
我想要解决的原始问题是我创建了一个线程来执行CPU绑定操作,该操作可能需要1秒钟才能完成,或者可能需要10个小时。我无法预测它需要多长时间。如果花费太多时间,我希望它能够在我/如果需要时优雅地放弃工作。我可以以某种方式将此消息传达给该线程吗?
答案 0 :(得分:4)
假设你在谈论一个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;
}