2012-09-06 48 views
0

我在我的KLM內部的Linux內核中有一些內核線程。
我有一個服務器線程,聽通道,一旦它看到有一個傳入的連接,它會創建一個接受套接字,接受連接併產生一個子線程。它還將接受的套接字作爲(void *)參數傳遞給子內核線程。一個線程可以打開一個套接字而其他線程關閉嗎?

該代碼工作正常。我有一個設計問題。
現在假設線程必須被終止,主線程和子線程,關閉接受套接字的最好方法是什麼。我可以看到兩種方式,
1]主線程等待所有子線程退出,每個子線程在退出時關閉接受套接字,最後一個子線程將一個信號傳遞給主線程以退出。在這裏,即使主線程是創建接受套接字的主線程,子線程也會關閉該套接字,並在主線程退出之前執行此操作。這是可以接受的嗎?你們在這裏遇到的任何問題?
2]其次是主線程關閉它在退出之前創建的所有接受套接字。但是可能有一種可能性(角落案例)主線程得到一個異常並且必須關閉,所以如果它在退出之前關閉了接受套接字,那麼使用該套接字的子線程將處於危險之中。

因此,我正在使用我提到的第一個案例。讓我知道你們是怎麼想的?

+0

我很好奇兒童如何關閉他們的插座。它們是不是應該在讀取操作中被阻塞,因此需要主線程關閉套接字才能解除封鎖? – Tudor

回答

0

我更喜歡選項1,因爲它是一個更清潔的解決方案:當一個特定的線程退出時,它清理它擁有的資源(線程擁有套接字,對嗎?)。這樣你就不會遇到像你提到的任何可能的角落案例,主線程關閉了一個可能在子線程中使用的套接字,等等。使用一個設計,其中一個子線程擁有套接字,並且是唯一一個讀/寫/關閉它很簡單,乾淨,並且導致更高的凝聚力。

第二個選項可以實現,以避免額外的邏輯和信號的角落情況,但它確實沒有必要添加額外的複雜性。我總是喜歡使用KISS principle

至於你關於關閉在不同的線程關閉一個套接字的問題比它創建的地方:這裏沒有問題。文件描述符(對於套接字和其他實體)在整個過程中是唯一的。如果我們談論分叉的流程,那麼情況就不一樣了。

0

首先關閉:對於套接字的「句柄」是一個整數,將整數移交給關閉函數將工作,而不管上下文。

關於你的設計..我會建議混合使用這兩種版本.. 創建一個列表(你鎖定,如果被訪問的話)open socket並且!每個線程關閉它的socket並從主列表中移除它。 退出主線程後,關閉所有剩餘的插座。 這樣一個子線程+主線程將不得不在一個套接字被打開之前死亡,這應該是所有情況描述的最小概率。

相關問題