C tiemout用于无限等待的函数(如listen())

C tiemout用于无限等待的函数(如listen()),c,multithreading,time,listen,C,Multithreading,Time,Listen,我不太确定是否有可能做到我要问的,所以我想我会问的 我有一个多线程程序,其中线程共享一个内存块来传递必要的信息。其中一个信息是线程终止,线程不断检查该值,当该值更改时,它们知道是时候执行pthread\u exit()。其中一个线程包含listen()函数,它似乎无限期地等待。如果没有人想要建立连接,并且线程需要退出,但由于线程被卡在listen()上且无法移动,因此无法检查该值是否需要终止,则这可能会有问题 while(1) { listen(); ... if(value ==

我不太确定是否有可能做到我要问的,所以我想我会问的

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

while(1)
{
  listen();
  ...
  if(value == 1)
    pthread_exit(NULL);
}
如果有助于更好地说明我的观点,我的逻辑就是这样。我认为解决这个问题的办法是允许listen()等待一段时间,如果什么也没有发生,它将转到下一个语句。不幸的是,
listen()
的两个参数都不涉及时间限制。我甚至不确定我是否使用了多线程编程的正确方法,我一点经验都没有。那么这是一个好方法吗?也许有更好的办法?谢谢你的宝贵意见


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

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

IIRC您需要设置超时,并在
listen()失败后检查errno,以确定是超时还是严重错误

在我看来,如果总是使用同一个连接套接字,那么只调用
listen()
一次应该是可行的。
但是,您可能会遇到与
accept()

相同的问题。您可以将套接字设置为非阻塞,并使用/或类似方法等待事件-选择/轮询允许您设置超时


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

我个人不会用信号使事情复杂化,单线程已经足够困难。很抱歉,我在多线程方面缺乏经验,如何在线程之间发送信号?我以为listen()正在等待传入的连接?我正在使用select()检查来自多个套接字的数据包(因为这是针对服务器的,并且将有多个客户端尝试连接),这是针对已建立的连接的。@否,
listen()
仅将套接字标记为被动“侦听”套接字,并立即返回。您必须稍后调用
accept()
来创建真正的连接(如果侦听套接字被阻塞,则可能会被阻塞)。抱歉,但我认为我理解得不太正确。我得到在listen()返回后使用accept()的结果。如果要使用select/poll,则应区分新接收的数据是否来自新连接,然后对新连接使用accept()?是。将侦听套接字添加到
select()
中设置的
readfds
,如果在
select()
返回时设置了侦听套接字,则可以对其调用
accept()
。问题是这是一个服务器程序,正在等待(尽管是listen())尚未建立的传入客户端连接(并将使用accept()建立)您只需要调用一次
listen()
,然后在循环中调用
accept()
accept()
是阻塞的,因此请参阅下面一些建议使用
select()
/
poll()
的好回答,谢谢您的澄清。我阅读了
select()/poll()
但我还有更多的问题。下面有人(nos&slacker)说listen()将套接字标记为就绪。它不仅仅是将其标记为被动的吗?那么它如何跟踪积压?我想你的建议是,在选择()/poll()时将调用accept()返回有一个套接字可供阅读?您能推荐任何有关此主题的互联网文献吗?我已经阅读了opengroup手册和beej的指南等..非常感谢!