我有一個線程在獨立線程管理的套接字上選擇的情況。如何優雅地選擇()可以在另一個線程上關閉的套接字?
當套接字關閉時,select()
可能會將該套接字作爲「可用」返回,直到我嘗試讀取它才意識到它已關閉。
但是我看到一個悖論:當插座從另一個線程關閉,系統無重新分配的文件描述符用於其他目的。 (我認爲)
如何通過我從插座(只是一個數字描述符)讀取時間系統尚未回收的那個描述,並用它爲一個新的套接字我得到保障?換句話說,就我所知,我可能正在從最近打開的某個其他套接字(可能是我不應該包含在我的select()
中的套接字)讀取而不是剛剛關閉的套接字。
我可以保持最近關閉的描述符列表,但我不知道是否有更好的方法。
如果使用阻塞套接字,從另一個線程關閉套接字通常是解除阻塞阻塞操作的唯一方法,特別是如果連接的遠程端點沒有正常關閉,阻塞操作沒有檢測到關閉權限並且在本地端點關閉之前變爲僵局。 –
我想(可能是盲目地)認爲OP由於引用了'select'而使用了非阻塞I/O,但是;在這種情況下,人們不得不使用信號量或類似的信號(可能是線程之間共享的變量)來表示關閉;在這種情況下,「閱讀器」線程應該立即檢查每次操作之後,如果設置了「關閉」標記/信號量,則「退出」...... – BRFennPocock
@BRPocock,您說的我正在使用非阻塞I/O。我認爲你是正確的,我將不得不統一這些套接字操作,以便它們始終從單個線程發生。我正在考慮可能選擇除了套接字之外的控制消息。 – mpontillo