线程删除设计

时间:2011-11-17 06:26:28

标签: multithreading

我有多线程程序。我的应用程序设计如下:

假设一个是主线程,而另一个是从属线程。主线程跟踪所有从属线程ID。在其中一个应用场景(其中一个场景是应用程序的正常关闭)中,我想从主线程中删除从属线程。 这里,从属线程可能正在执行,即处于睡眠模式或做一些我无法停止动作的动作。所以我想从内部存储的线程ID中删除主线程中的线程。

其他信息: 虽然删除i不应该等待线程当前操作完成,因为它可能需要很长时间,因为我从数据库读取并在线程中采取一些操作,如果gracefull关闭我不应该等待操作完成,因为它可能需要时间。

如果我强制删除一个线程怎么会有资源泄漏?

以上设计是否正常,或者有任何流程或任何方式我们可以改进设计。

谢谢!

2 个答案:

答案 0 :(得分:1)

不行。强行从另一个线程中杀死一个线程是一种不好的做法,因为你非常可能会有资源泄漏。最好的方法是使用事件或信号来通知客户端进程停止并等待它们正常退出。

程序的总体流程如下:

  1. 父线程创建一个事件(比如hEventParent)。然后它创建子线程并将hEventParent作为参数传递。 Parent线程保留子线程的hThread
  2. 子线程确实有效,但会定期等待hEventParent
  3. 当程序需要退出时,父线程设置hEventParent。然后它等待hThreadWaitForMultipleObjects也接受hThread)
  4. 通知子线程然后执行清理例程并退出。
  5. 当所有线程退出时,父节点可以退出。

答案 1 :(得分:0)

最常见的方法是主线程向所有线程发送终止信号,然后等待线程结束。

通常,工作线程将有一个循环,在其中完成工作。您可以添加一个布尔变量,指示线程是否需要结束。例如:

terminate = false;
while (!terminate) {
    // work here
}

如果你希望你的工作线程在没有工作的情况下进入睡眠状态,那么它会变得有点复杂。在这种情况下,您可以让线程在信号量上等待。当有工作要做时,每个信号量都会发出信号,这将唤醒线程。当发出终止请求时,您还将发信号通知信号量。示例工作线程:

terminate = false;
while (!terminate) {
    // work here
    wait(semaphore); // go to sleep
}

当主线程要退出时,它将为所有线程将terminate设置为true,然后通知线程信号量以唤醒线程并让它们有机会查看终止请求。之后它将join所有线程,并且只有在所有线程完成后它才会退出。

请注意,如果您使用的是C / C ++,则terminate布尔值可能需要声明为volatile,以向编译器指示它可能会从另一个线程更改。