如何从vala中的另一个线程中杀死一个线程

时间:2013-04-25 07:15:46

标签: multithreading vala

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

任何帮助都会很明显。

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

1 个答案:

答案 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;
}