[網絡通訊]同一socket使用兩個線程分別收發,如何關閉socket

一、一般咱們使用select或poll在一個線程中處理socket的收與發。若是對同一socket,有兩個線程,一個線程用於發送,一個線程用於接收,當發送或接收發現socket須要關閉時,如何正確地處理?安全

由於一個線程中關閉了的socket,而該socket可能在另外一個線程中還在被使用。socket

極端狀況下,一個線程關閉了socket,而後又建立了一個新的socket,這個socket句柄與以前的相同,可能會形成另外一線程使用了新的socket,而沒有覺察以前的socket已經變化了。線程

二、引用計數進程

考慮使用引用計數,初使化爲2,用線程安全的方式對計數處理,將計數降爲0的線程,負責關閉該socket。select

三、句柄複製引用

在使用前,對句柄進行dup,兩個線程分別使用不一樣的句柄。這樣兩個線程關閉就互不影響,相似於fork的兩個進程中使用同一個socket句柄。方法

四、還有其它更好的方法嗎?線程安全

相關文章
相關標籤/搜索