2013-11-27 90 views
4

我有一個類Class,其中有一個線程的成員屬性HANDLE handle(我們可以假設它在此時設置爲NULL)。在某種程度上,Class中的方法使用CreateThread()調度其自己的方法Class::threaded()(使用該類本身外部的另一個函數,但這並不重要)。調用線程然後可以繼續在Class之外的其他功能。誰負責調用CloseHandle()來處理線程

由於CloseHandle()必須要求從CreateThread()返回HANDLE,我在想,如果從Class::threaded()之前返回將是一個不錯的解決方案調用它。

+0

由於您已將此標記爲C++,因此您應該使用_beginthread或_beginthreadex。請參閱'CreateThread'文檔:「調用C運行時庫(CRT)的可執行文件中的線程應該使用_beginthreadex和_endthreadex函數進行線程管理,而不是CreateThread和ExitThread;」 – Steve

+1

這是上個世紀的建議。 CRT已經做了調整來解決這個問題,而不是必須支持線程池線程,你當然不能調用_beginthreadex。它現在在需要時即時分配線程本地數據。 –

回答

13

處理線程的兩種基本方法。通常情況下,當線程終止時,你會感興趣,你需要保持這個句柄,以便你能找到答案。當然,你會在檢測到終止後關閉它。或者你不在乎,即發即棄的風格,或者有額外的同步對象來表示線程函數完成和/或你要求它退出。在這種情況下,您只要在啓動時就關閉手柄。

請記住,它是而不是必須保持打開的句柄,以保持線程運行,以防萬一這是混淆的根源。

5

您會收到一個線程句柄,以便您可以對其進行管理。如果沒有必要,您可以立即致電CloseHandle

關閉HANDLE將不會終止線程,因此,如果線程中沒有任何內容對您感興趣,則關閉該線程是安全的。

+0

線程'HANDLE'通常用於同步,而不僅僅是管理。您可能想要添加,關閉'HANDLE'不會終止該線程。 – IInspectable

4

只要您使用它,您就可以關閉它。關閉它對線程沒有影響。 (該句柄是由OS統計的參考。)