2

我有一个主线程,它创建另一个线程来执行某些工作。主线程有对该线程的引用。即使线程仍在运行,我如何在一段时间后强行终止该线程。我找不到合适的函数调用来做到这一点。

任何帮助都将是可观的。

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

4

1 回答 1

5

假设你在谈论 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;
}
于 2013-04-25T16:17:20.460 回答