我正在使用Berkeley套接字处理windows / unix多线程服务器应用程序网络层并偶然发现问题:
可能的解决方案是在select中添加超时。我已经在使用select(15年前)的网站上看到了这一点。
问题是:
还有其他解决方案吗?等待超时仍会导致某种程度的饥饿并从select-waiter线程中获取CPU时间。我认为可以重新设计应用程序,但添加套接字也是从select-waiter线程(并且绝对应该有)不知道的线程完成的,因此无法避免这种情况。
如果没有,应选择什么样的超时来实现最佳性能/服务质量?
另请注意,我确实意识到最好使用更高级的API(iocp,kqueue,...)或者能够为我做的lib,但这对我来说不是一个选择点。
由于
答案 0 :(得分:4)
创建一个额外的套接字对,并将其中一个套接字添加到每个select
。要中断正在运行的select
,请通过另一个套接字向其发送消息。
仅在Unix端,可以使用SIGUSR1
向等待线程发送任何信号(例如pthread_kill
)。 select
然后返回一个负值,errno
将设置为EINTR
。但在Windows方面没有类似的东西。