线程删除设计



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

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

额外的信息:在删除时,我不应该等待线程当前操作完成,因为它可能需要很长时间,因为我正在从数据库读取并在线程中采取一些操作,在优雅关闭的情况下,我不应该等待操作完成,因为它可能需要时间。

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

上面的设计是可以的,或者有任何流程或任何方法我们可以改进设计。

谢谢!

不行。从另一个线程强制终止一个线程是一种不好的做法,因为您将非常有可能发生资源泄漏。最好的方法是使用事件或信号通知客户端进程停止并等待,直到它们优雅地退出。

程序的整体流程看起来像这样:

  1. 父线程创建事件(例如hEventParent)。然后创建子线程并传递hEventParent作为参数。父线程保留子线程的hThread
  2. 子线程可以工作,但是会周期性地等待hEventParent
  3. 当程序需要退出时,父线程设置hEventParent。然后等待hThread (WaitForMultipleObjects也接受hThread)
  4. 通知子线程,然后执行清理例程并退出。
  5. 当所有线程退出时,父线程可以退出。

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

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

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

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

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

当主线程想要退出时,它会为所有线程设置terminate为true,然后发出线程信号量来唤醒线程,并给它们一个机会看到终止请求。之后,它将join所有线程,只有在所有线程完成后,它才会退出。

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

最新更新