2011-11-17 103 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