【发布时间】:2011-02-05 16:00:44
【问题描述】:
我不太确定是否可以做我要问的事情,所以我想我会问。
我有一个多线程程序,其中线程共享一个内存块来传递必要的信息。其中一个信息是线程终止,其中线程不断检查此值,当值更改时,它们知道是pthread_exit() 的时间了。其中一个线程包含listen() 函数,它似乎无限期地等待。如果没有人想要建立连接并且线程需要退出但它无法检查线程是否需要终止的值,因为它卡在listen() 上并且无法移动,这可能会出现问题。
while(1)
{
listen();
...
if(value == 1)
pthread_exit(NULL);
}
如果它有助于更好地说明我的观点,我的逻辑就是这样。我认为可以解决问题的是允许 listen() 等待一段时间,如果没有任何反应,它会继续执行下一条语句。不幸的是,listen() 的两个参数都没有涉及时间限制。我什至不确定我是否正在采用正确的多线程编程方式,我一点经验都没有。那么这是一个好方法吗?也许有更好的方法来解决它?感谢任何有见地的 cmets。
编辑:澄清一点,listen() 在 while 循环中的原因是这是一个服务器,一次将连接到多个客户端。
【问题讨论】:
-
您只需调用一次
listen(),然后在循环中调用accept()。accept()是阻止的,所以请参阅下面的一些好的回复,建议使用select()/poll() -
感谢您解决这个问题。我阅读了
select()/poll(),但我还有更多问题。下面的人(nos & slacker)说listen() 将套接字标记为就绪。除了将其标记为被动之外,还有更多的意义吗?那么它是如何跟踪积压的呢?我认为您的建议是当 select()/poll() 返回有一个要读取的套接字时会调用 accept() 吗?你能推荐任何关于这个主题的网络文献吗?我已经阅读了 opengroup 手册和 beej 的指南等。非常感谢!
标签: c multithreading time listen