2014-07-10 35 views
2

我有一個輸入case語句的代碼塊。如果遇到正確的案例,我需要創建一個新線程並繼續執行工作。這種case語句可以多次調用,創建多個同時運行的線程。何時釋放C中動態分配的pthread_t指針?

因此,我想我需要創建一個pthread_t *,malloc一些內存,然後調用pthread_create()。但是,我仍然需要釋放pthread_t *嗎?我不想創建內存泄漏。如果我需要釋放它,我該如何以及在哪裏釋放它?

例:

case MY_CASE: 
    ; 
    pthread_t* foo = (pthread_t*)malloc(sizeof(pthread_t)); 
    pthread_create(foo, NULL, SomeFunction, &SomeParameters); 
    . 
    . 
    . 
later 
    . 
    . 
    . 
free(foo); // Should this be in the code? If so, where? 
/* I need to ensure the main thread keeps running. So, I cannot use pthread_join() */ 
+0

你加入你的話題?如果是的話,我相信你做到了。 –

+0

不,我不能使用pthread_join(),因爲我需要執行主線程才能繼續。使用連接將掛起主線程,直到目標線程終止。 – Maxthecat

+0

只要沒有線程需要它,就可以使用'free()'釋放結構,如圖所示。但是,如果您不知道該結構是否有線程描述,那麼您可能無法可靠地解決問題。 –

回答

1

免費你叫pthread_join(*foo, &retval);後的記憶。

如果您希望輪詢所有線程以查看它們是否已完成,請保留一組打開的句柄並對其調用pthread_tryjoin_np。然後調用free(並從數組中移除)已終止線程的指針。

或者,您可以在您的線索上致電pthread_detach。這更便於攜帶,並且如果您不關心線程是否已終止,則可以很好地工作。在這種情況下, 的pthread_detach手冊頁這樣說:

一個新的線程可以使用pthread_attr_setdetachstate(3)設置的pthread_create(3)

,您可以在ATTR參數的分離屬性的分離狀態創建完全跳過malloc

+0

但是,pthread_join會暫停,直到子線程終止。我需要父線程才能繼續。 – Maxthecat

+0

@Maxthecat:我剛剛看到了。更新。 – nmichaels