我有一个阻止调用accept()。从另一个线程我关闭套接字,希望它将解除对accept()调用的阻塞,但它有一个例子,当它没有:例如线程A输入accept(),线程B关闭套接字,线程A不从accept()返回。
问题:什么可能导致关闭套接字而不解锁accept()?
答案 0 :(得分:2)
解锁accept(2)
的一个hacky技巧是从你的其他线程到侦听端实际connect(2)
。翻转一些标志,指示是时候停止循环,connect(2)
,close(2)
连接套接字。这样accept(2)
- 线程就会知道关闭套接字并自行关闭。
答案 1 :(得分:1)
当另一个线程正在或可能正在使用它时,您不能在一个线程中释放资源。您将从不让它可靠地运行。首先,你永远不能100%确定线程在accept
中实际被阻止,而不是阻止它。所以总会有竞争条件。
当然,shutdown
将无效,因为套接字未连接。
有几种方法可以解决这个问题。例如,您可以设置一个标志,线程在从accept
返回时检查,然后自己建立连接。这将导致线程从accept
返回,然后它将看到该标志并终止。
您也可以切换到非阻塞套接字。让线程调用select
或poll
超时,并检查线程是否应该从select
或poll
返回时终止。您还可以在套接字和管道上select
或poll
。然后只需在管道上发送一个字节来取消阻塞线程。 pthread_kill
是另一种可能性,pthread_cancel
也是如此。
不知道你的问题的细节,我的猜测是最好的解决方案是重新架构,所以你没有一个线程,其唯一的工作是永远等待accept
。这样,你甚至不需要杀死一个线程。如果您不想继续接受连接,那么只需要对线程进行操作以使线程停止这样做,但让线程继续执行其他操作。 (您运行的线程数应取决于您可以立即执行的操作数量,而不是您必须执行的操作总数。)
答案 2 :(得分:0)
尝试从主题 B 调用shutdown()
后跟close()
。您应该检查这些调用的返回代码,因为它们可以帮助您在线程 A 无法解锁时找出问题所在。