无限期等待的函数的超时(如listen())

时间:2010-04-08 11:37:24

标签: c multithreading time listen

我不太确定是否可以做我要问的事情,所以我想我会问。

我有一个多线程程序,其中线程共享一个内存块以传递必要的信息。其中一个信息是线程终止,线程不断检查这个值,当值发生变化时,他们知道pthread_exit()的时间。其中一个线程包含listen()函数,它似乎无限期地等待。如果没有人想要建立连接并且线程需要退出但是它无法检查线程是否需要终止,因为它卡在listen()上并且无法超越,这可能会有问题。

while(1)
{
  listen();
  ...
  if(value == 1)
    pthread_exit(NULL);
}

如果有助于更好地说明我的观点,我的逻辑就是这样的。我认为可以解决问题的方法是让listen()等待一段时间,如果没有任何反应,它会转到下一个语句。不幸的是,listen()的两个参数都没有时间限制。我甚至不确定我是否采用多线程编程正确的方式,我根本没有多少经验。那么这是一个好方法吗?或许还有更好的方法可以解决这个问题吗?感谢任何有见地的评论。

编辑:只是为了澄清一下,listen()在while循环中的原因是这是一个服务器,并且一次将连接到多个客户端。

3 个答案:

答案 0 :(得分:1)

您应该从另一个线程(将值更改为1的线程)发送信号。它将使listen函数返回EINTR错误代码。

答案 1 :(得分:0)

IIRC您需要使用setsockopt()设置超时,并在listen()无法查看是否超时或严重错误后检查错误。

对我来说,如果你总是使用相同的连接套接字,那么只应该调用listen()一次。 但也许你会遇到与accept()相同的问题。

答案 2 :(得分:0)

您可以将套接字设置为非阻塞,并使用select / poll或类似情况等待事件 - select / poll允许您设置超时。

请注意,listen()不会阻塞,它只是标记套接字准备好处理传入的连接 - accept()将是下一步,它会阻塞。