2012-05-13 47 views
5

我正在處理一個項目,其中有一個主線程和一個守護程序線程來執行文件輸出。在我的主線程中,我有一個字段pthread_t * _daemon,我想刪除,但顯然只有在_daemon返回NULL(我明白使用pthread_exit()導致內存泄漏)。只有在它返回後才刪除守護程序線程

我怎樣才能不用忙碌等待呢?如果我嘗試使用條件變量,則出現問題 - 當我呼叫signal()表單_daemon喚醒我的主線程時,它會在_daemon返回NULL之前刪除_daemon

我所做的只是使用一個互斥鎖,當程序在_daemon返回之前啓動並解鎖時,該鎖被鎖定。有沒有更好的方法,不會導致等待?

+1

'pthread_join'? – Mat

+0

目前還不清楚你在問什麼。你想要刪除什麼? –

+0

pthread_t字段,但只有守護程序線程存儲在那裏後返回 – yotamoo

回答

5

pthread_detach()做你正在尋找。這聽起來像它會解決你的問題(不泄漏),而且複雜程度要低得多!

因此,當您在其他線程中完成它時,您可以放心地呼叫pthread_detatch(_daemon),而無需擔心線程本身是否仍在運行。它確實是而不是終止線程,而是導致線程在終止時被清除。

從文檔:

pthread_detach()功能應該指示執行 是存儲該線程的線程可以在線程終止 時被回收。如果線程沒有終止,pthread_detach()不應該 導致它終止。

實際上,你可以在分離狀態創建線程通過設置attr入手:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

適當的創建時間。該pthread_create()手冊頁說:

當 分離線程終止,其資源將自動釋放回 系統。 [snip]使線程脫離對於某些類型的守護進程 線程是有用的,該線程的應用程序不需要關心退出狀態。默認情況下,除非attr被設置爲 ,否則創建處於分離狀態的線程(使用pthread_attr_setdetachstate(3)),從而創建一個新的線程處於可連接狀態。

+0

但是我想釋放的_deamon在主線程中,而不在守護進程線程中。我想在daemon線程終止後才刪除這個字段 – yotamoo

+2

@yotamoo:在與它關聯的線程返回或以其他方式完成之前,可以刪除一個'pthread_t'對象。線程本身不依賴於'pthread_t'對象 - 刪除'pthread_t'對象不會破壞關聯的線程。但是您可能需要調用'pthread_detach()'讓系統知道它可以在線程返回或退出時清除所有線程資源。 –

+0

「刪除pthread_t對象」意味着什麼? – alk

1

pthread_tunsigned long int,所以我真的不認爲有必要使pthread_t指針(你可以和使用它的地址pthread功能),但如果你堅持,那麼你可以之後將其刪除創建一個pthread(但是然後你將無法與它通信,因爲它是一些創建的線程 - 用於加入,分離函數等)。