2011-06-15 151 views
6
 pthread_create(&thread, NULL, AcceptLoop, (void *)this); 

我已經聲明這樣和AcceptLoop函數內部我有無限的while循環。當服務器關閉時,我想關閉此線程。我已閱讀pthread_cancel和pthread_join,但我不確定哪一個更好,更安全。我想聽聽一些詳細的說明或教程。提前致謝。如何安全地關閉線程?

回答

1

我相信你想從主線程的信號,退出工作線程。

Inside AcceptLoop而不是循環無限循環條件,你可以通過你的主線程設置條件,你將不得不使用一些同步這個變量。一旦從主線程設置變量,工作線程AcceptLoop就會爆發,然後可以調用pthread_exit

如果你想讓你的主線程等待子線程退出,你可以使用pthread_join來這樣做。

一般情況下,一個子線程可以在三個條件下退出:

  1. 調用pthread_exit
  2. 致電pthread_cancel
  3. 線程函數返回。
2

你不需要做任何事情,只是從線程函數返回將乾淨地結束線程。您也可以撥打pthread_exit(),但我寧願回來。 pthread_cancel()是可怕和複雜/很難得到正確的。如果可能,保持清醒。 pthread_join()如果您想知道線程何時完成並且對return值感興趣,則最主要需要。

哎呀,我錯了。已經有一段時間了。爲了我所說的是真實的,你必須脫離你的線索。否則,你就需要調用pthread_join函數:

無論是在pthread_join(3)或 pthread_detach()應該呼籲 每個線程 該應用程序創建,使該線程 系統資源可以 發佈。 (但是請注意,所有線程的資源被釋放 當 進程終止。)

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_detach.3.html

+2

這一切都取決於線程是否被分離。如果沒有,那麼你將需要pthread_join線程來清理線程的內存。如果你已經分離了,那麼是從主函數或pthread_exit()返回。 – Suroot 2011-06-15 03:55:49

+0

@Suroot你是100%正確的,我編輯了我的答案來反映。 – 2011-06-15 03:59:11