[网络通讯]同一socket使用两个线程分别收发,如何关闭socket

一、一般咱们使用select或poll在一个线程中处理socket的收与发。若是对同一socket,有两个线程,一个线程用于发送,一个线程用于接收,当发送或接收发现socket须要关闭时,如何正确地处理?安全

由于一个线程中关闭了的socket,而该socket可能在另外一个线程中还在被使用。socket

极端状况下,一个线程关闭了socket,而后又建立了一个新的socket,这个socket句柄与以前的相同,可能会形成另外一线程使用了新的socket,而没有觉察以前的socket已经变化了。线程

二、引用计数进程

考虑使用引用计数,初使化为2,用线程安全的方式对计数处理,将计数降为0的线程,负责关闭该socket。select

三、句柄复制引用

在使用前,对句柄进行dup,两个线程分别使用不一样的句柄。这样两个线程关闭就互不影响,相似于fork的两个进程中使用同一个socket句柄。方法

四、还有其它更好的方法吗?线程安全

相关文章
相关标签/搜索