我在我的KLM內部的Linux內核中有一些內核線程。
我有一個服務器線程,聽通道,一旦它看到有一個傳入的連接,它會創建一個接受套接字,接受連接併產生一個子線程。它還將接受的套接字作爲(void *)參數傳遞給子內核線程。一個線程可以打開一個套接字而其他線程關閉嗎?
該代碼工作正常。我有一個設計問題。
現在假設線程必須被終止,主線程和子線程,關閉接受套接字的最好方法是什麼。我可以看到兩種方式,
1]主線程等待所有子線程退出,每個子線程在退出時關閉接受套接字,最後一個子線程將一個信號傳遞給主線程以退出。在這裏,即使主線程是創建接受套接字的主線程,子線程也會關閉該套接字,並在主線程退出之前執行此操作。這是可以接受的嗎?你們在這裏遇到的任何問題?
2]其次是主線程關閉它在退出之前創建的所有接受套接字。但是可能有一種可能性(角落案例)主線程得到一個異常並且必須關閉,所以如果它在退出之前關閉了接受套接字,那麼使用該套接字的子線程將處於危險之中。
因此,我正在使用我提到的第一個案例。讓我知道你們是怎麼想的?
我很好奇兒童如何關閉他們的插座。它們是不是應該在讀取操作中被阻塞,因此需要主線程關閉套接字才能解除封鎖? – Tudor