我有一个主线程,它创建另一个线程来执行某些工作。主线程有对该线程的引用。即使线程仍在运行,我如何在一段时间后强行终止该线程。我找不到合适的函数调用来做到这一点。
任何帮助都将是可观的。
我要解决的原始问题是我创建了一个线程来执行 CPU 绑定操作,这可能需要 1 秒或 10 小时才能完成。我无法预测需要多少时间。如果花费太多时间,我希望它在我愿意的时候/如果我愿意,优雅地放弃工作。我可以以某种方式将此消息传达给该线程吗?
我有一个主线程,它创建另一个线程来执行某些工作。主线程有对该线程的引用。即使线程仍在运行,我如何在一段时间后强行终止该线程。我找不到合适的函数调用来做到这一点。
任何帮助都将是可观的。
我要解决的原始问题是我创建了一个线程来执行 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;
}