2012-09-03 38 views
0

我使用CreateThread然後TerminateThread取消線程。看起來堆棧空間仍然被分配。有沒有辦法解決這個問題?我沒有使用任何形式的動態內存調用,如malloc/new。線程不必優雅地退出。 10條線程留下了高達5MB的內存!線程都在代碼的不同部分,那麼是否有一種簡單的方法來實現一個線程間通信系統,它可以告訴他們所有的退出,並因此調整堆棧的方向?CreateThread其次TerminateThread留下了很多內存

+1

5MB爲什麼很重要?你確定你不是間接使用malloc:即使'printf'也可以使用它。而你的問題是操作系統的依賴。 –

回答

11

在大多數情況下,您應該使用而不是使用TerminateThread()。如果您在應用程序中創建新線程,則有責任確保這些線程正常退出。當您使用TerminateThread()時,可能會留下各種資源,因爲此功能只是在不調用清理功能的情況下終止線程。

TerminateThread documentation

你應該做的是利用事件(或其他信號的方法)要告訴你的線程他們應該關閉。當線程在內部接收到消息時(事件發信號或等待過期等),線程函數可以在內部清除並返回。這樣你就可以正確退出你的線程,不會留下任何混亂。

3

您的主線程上的一個非自動重置事件和一個WaitForMultipleObjects將執行您想要的操作。如果發現自己超過64個併發工作線程,則必須重新工具才能使用其他方法,例如非自動重置事件和信號量。實際上有幾十種方法可以解決這個問題,並且在整個互聯網論壇上有無數的例子,以及MS在Visual Studio發行版中的例子。從那些開始。

+0

爲什麼你認爲需要'WaitForMultipleObjects'? – MSalters

+0

只要設置關機事件並退出主線程就可以了,如果你不想知道它們實際上全部關閉了。如果您需要知道它們全部停止,那麼設置事件並等待所有線程句柄發信號(即終止)最好使用WFMO完成。爲什麼有人會這樣做?可能是一個巨大的原因列表。 – WhozCraig