我有多线程程序。我的应用程序设计如下:
假设一个是主线程,而另一个是从属线程。主线程跟踪所有从属线程ID。在其中一个应用场景(其中一个场景是应用程序的正常关闭)中,我想从主线程中删除从属线程。 这里,从属线程可能正在执行,即处于睡眠模式或做一些我无法停止动作的动作。所以我想从内部存储的线程ID中删除主线程中的线程。
其他信息: 虽然删除i不应该等待线程当前操作完成,因为它可能需要很长时间,因为我从数据库读取并在线程中采取一些操作,如果gracefull关闭我不应该等待操作完成,因为它可能需要时间。
如果我强制删除一个线程怎么会有资源泄漏?
以上设计是否正常,或者有任何流程或任何方式我们可以改进设计。
谢谢!
答案 0 :(得分:1)
不行。强行从另一个线程中杀死一个线程是一种不好的做法,因为你非常可能会有资源泄漏。最好的方法是使用事件或信号来通知客户端进程停止并等待它们正常退出。
程序的总体流程如下:
hEventParent
)。然后它创建子线程并将hEventParent
作为参数传递。 Parent线程保留子线程的hThread
。hEventParent
。hEventParent
。然后它等待hThread
(WaitForMultipleObjects
也接受hThread)答案 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
,以向编译器指示它可能会从另一个线程更改。