我有多线程程序。我有一个我的应用程序的设计如下:
假设一个是主线程,另一个是从线程。主线程跟踪所有从线程ID。在应用程序的一个场景中(其中一个场景是应用程序的优雅关闭),我想从主线程中删除从线程。在这里,从线程可能正在执行,即,要么在睡眠模式下,要么做一些我无法停止的动作。所以我想删除线程从主线程与线程id我存储在内部。
额外的信息:在删除时,我不应该等待线程当前操作完成,因为它可能需要很长时间,因为我正在从数据库读取并在线程中采取一些操作,在优雅关闭的情况下,我不应该等待操作完成,因为它可能需要时间。
如果我强制删除一个线程怎么可能会有资源泄漏?
上面的设计是可以的,或者有任何流程或任何方法我们可以改进设计。
谢谢!
不行。从另一个线程强制终止一个线程是一种不好的做法,因为您将非常有可能发生资源泄漏。最好的方法是使用事件或信号通知客户端进程停止并等待,直到它们优雅地退出。
程序的整体流程看起来像这样:
- 父线程创建事件(例如
hEventParent
)。然后创建子线程并传递hEventParent
作为参数。父线程保留子线程的hThread
。 - 子线程可以工作,但是会周期性地等待
hEventParent
。 - 当程序需要退出时,父线程设置
hEventParent
。然后等待hThread
(WaitForMultipleObjects
也接受hThread) - 通知子线程,然后执行清理例程并退出。
- 当所有线程退出时,父线程可以退出。
最常见的方法是主线程向所有线程发送终止信号,然后等待线程结束。
工作线程通常有一个循环,在其中完成工作。您可以添加一个布尔变量来指示线程是否需要结束。例如:
terminate = false;
while (!terminate) {
// work here
}
如果你想让你的工作线程在没有工作的时候进入睡眠状态,那么它就变得有点复杂了。在这种情况下,可以让线程等待信号量。当有工作要做时,每个信号量都会被发出信号,这将唤醒线程。当发出终止请求时,还将向信号量发出信号。工作线程示例:
terminate = false;
while (!terminate) {
// work here
wait(semaphore); // go to sleep
}
当主线程想要退出时,它会为所有线程设置terminate
为true,然后发出线程信号量来唤醒线程,并给它们一个机会看到终止请求。之后,它将join
所有线程,只有在所有线程完成后,它才会退出。
注意,如果使用C/c++, terminate
布尔值可能需要声明为volatile
,以指示编译器它可能从另一个线程更改。