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

本文探讨了在多线程环境下如何安全地关闭Socket连接,避免因其中一个线程关闭Socket而导致其他线程误用已关闭的Socket的问题。提出了使用引用计数、句柄复制等方法,并邀请读者分享更多解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、通常我们使用select或poll在一个线程中处理socket的收与发。如果对同一socket,有两个线程,一个线程用于发送,一个线程用于接收,当发送或接收发现socket需要关闭时,如何正确地处理?

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

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

2、引用计数

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

3、句柄复制

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

4、还有其它更好的方法吗?

转载于:https://my.oschina.net/u/136074/blog/686507

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值