2

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

我有一个多线程程序,其中线程共享一个内存块来传达必要的信息。其中一个信息是线程终止,其中线程不断检查此值,当值更改时,它们知道是时候执行pthread_exit(). 其中一个线程包含listen()函数,它似乎无限期地等待。如果没有人想要建立连接并且线程需要退出但它无法检查线程是否需要终止的值,因为它被卡住listen()并且无法移动,这可能会出现问题。

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

如果它有助于更​​好地说明我的观点,我的逻辑就是这样。我认为可以解决问题的是允许 listen() 等待一段时间,如果没有任何反应,它会继续执行下一条语句。不幸的是,两个参数都没有listen()涉及时间限制。我什至不确定我是否正在使用多线程编程的正确方式,我一点经验都没有。那么这是一个好方法吗?也许有更好的方法来解决它?感谢任何有见地的评论。

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

4

3 回答 3

1

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

于 2010-04-08T11:41:31.510 回答
0

IIRC 您需要设置超时setsockopt(),并在失败后检查 errnolisten()以查看它是超时还是严重错误。

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

于 2010-04-08T11:48:46.320 回答
0

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

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

于 2010-04-08T11:59:34.650 回答