C / C ++当select处于挂起状态时,将套接字添加到fd_set

时间:2014-05-03 11:05:58

标签: c++ c multithreading select add

我正在使用Berkeley套接字处理windows / unix多线程服务器应用程序网络层并偶然发现问题:

  • 我有一个线程在给定fd集的select中等待。
  • 从另一个线程,我需要为其中一个fd集添加一个套接字。
  • 由于选择目前正在等待,因此无法完成并导致饥饿。

可能的解决方案是在select中添加超时。我已经在使用select(15年前)的网站上看到了这一点。

问题是:
还有其他解决方案吗?等待超时仍会导致某种程度的饥饿并从select-waiter线程中获取CPU时间。我认为可以重新设计应用程序,但添加套接字也是从select-waiter线程(并且绝对应该有)不知道的线程完成的,因此无法避免这种情况。

如果没有,应选择什么样的超时来实现最佳性能/服务质量?

另请注意,我确实意识到最好使用更高级的API(iocp,kqueue,...)或者能够为我做的lib,但这对我来说不是一个选择点。

由于

1 个答案:

答案 0 :(得分:4)

创建一个额外的套接字对,并将其中一个套接字添加到每个select。要中断正在运行的select,请通过另一个套接字向其发送消息。

仅在Unix端,可以使用SIGUSR1向等待线程发送任何信号(例如pthread_kill)。 select然后返回一个负值,errno将设置为EINTR。但在Windows方面没有类似的东西。