解锁接受()

时间:2010-09-10 01:24:41

标签: windows sockets

我有一个阻止调用accept()。从另一个线程我关闭套接字,希望它将解除对accept()调用的阻塞,但它有一个例子,当它没有:例如线程A输入accept(),线程B关闭套接字,线程A不从accept()返回。

问题:什么可能导致关闭套接字而不解锁accept()?

3 个答案:

答案 0 :(得分:2)

解锁accept(2)的一个hacky技巧是从你的其他线程到侦听端实际connect(2)。翻转一些标志,指示是时候停止循环,connect(2)close(2)连接套接字。这样accept(2) - 线程就会知道关闭套接字并自行关闭。

答案 1 :(得分:1)

当另一个线程正在或可能正在使用它时,您不能在一个线程中释放资源。您将从不让它可靠地运行。首先,你永远不能100%确定线程在accept中实际被阻止,而不是阻止它。所以总会有竞争条件。

当然,shutdown将无效,因为套接字未连接。

有几种方法可以解决这个问题。例如,您可以设置一个标志,线程在从accept返回时检查,然后自己建立连接。这将导致线程从accept返回,然后它将看到该标志并终止。

您也可以切换到非阻塞套接字。让线程调用selectpoll超时,并检查线程是否应该从selectpoll返回时终止。您还可以在套接字和管道上selectpoll。然后只需在管道上发送一个字节来取消阻塞线程。 pthread_kill是另一种可能性,pthread_cancel也是如此。

不知道你的问题的细节,我的猜测是最好的解决方案是重新架构,所以你没有一个线程,其唯一的工作是永远等待accept。这样,你甚至不需要杀死一个线程。如果您不想继续接受连接,那么只需要对线程进行操作以使线程停止这样做,但让线程继续执行其他操作。 (您运行的线程数应取决于您可以立即执行的操作数量,而不是您必须执行的操作总数。)

答案 2 :(得分:0)

尝试从主题 B 调用shutdown()后跟close()。您应该检查这些调用的返回代码,因为它们可以帮助您在线程 A 无法解锁时找出问题所在。