2011-11-17 52 views
0

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

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

附加信息: 删除时,我不应该等待线程当前动作完成,因为它可能需要很长时间,因为我正在从数据库中读取并在线程中采取一些操作,以防恩惠关闭,我不应该等待采取行动完成,因为它可能需要时间。

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

以上的设计是好的,或有任何流量或任何方式,我们可以改进设计。

谢谢!

回答

1

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

程序的整个流程是这样的:

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

正如你所提到的,如果我们强行杀死一个线程会有资源泄漏,你可以举一个例子说明如何有内存泄漏? – venkysmarty

+0

最明显的是为堆栈分配的内存。如果强制终止线程,正在运行的函数将无法返回,并且永远不会释放内存。在其他情况下,诸如堆内存,套接字,文件句柄之类的东西将无法正确释放,因为您没有给它们这样的机会。 – JosephH

0

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

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

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

如果您希望工作线程在他们没有工作时进入睡眠状态,则会变得更加复杂。在这种情况下,你可以让线程等待信号量。当有工作需要做时,每个信号灯都会发出信号,并唤醒线程。当发出终止请求时,您也会发出信号。例如工作线程:

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

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

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

+0

实际上,我在线程中的工作可能需要很长时间才能完成,因为我必须从数据库中读取数据等等,所以当优美的喊声我不能等待那么久,那我们该怎么做呢?我有强制删除会有内存泄漏,怎么会有memeory泄漏?谢谢 – venkysmarty