C/C++在选择挂起时将套接字添加到fd_集合

C/C++在选择挂起时将套接字添加到fd_集合,c++,c,multithreading,select,add,C++,C,Multithreading,Select,Add,我正在使用Berkeley sockets开发windows/unix多线程服务器应用程序网络层,偶然发现了一个问题: 我有一个线程在指定的fd集合中等待select。 从另一个线程,我需要向一个fd集添加一个套接字。 由于select当前处于挂起状态,因此无法执行,并导致饥饿。 可能的解决方案是向select添加超时。我在15年前与select建立网络的网站上看到了这一点 问题是: 还有其他解决办法吗?等待超时仍然会导致某种程度的饥饿,并占用select WAERER线程的CPU时间。我认为重

我正在使用Berkeley sockets开发windows/unix多线程服务器应用程序网络层,偶然发现了一个问题:

我有一个线程在指定的fd集合中等待select。 从另一个线程,我需要向一个fd集添加一个套接字。 由于select当前处于挂起状态,因此无法执行,并导致饥饿。 可能的解决方案是向select添加超时。我在15年前与select建立网络的网站上看到了这一点

问题是: 还有其他解决办法吗?等待超时仍然会导致某种程度的饥饿,并占用select WAERER线程的CPU时间。我认为重新设计应用程序是可能的,但添加套接字也是从selectwaterthread拥有的线程中完成的,而且绝大多数情况下都不应该知道,因此这种情况无法避免

如果不是,应选择哪种超时来实现最佳性能/服务质量

还要注意的是,我意识到最好使用更高级的API iocp、kqueue。。。或者一个可以为我做这件事的lib,但在给定的点上,这不是我的选择


谢谢

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


仅在Unix端,可以使用pthread_kill向等待的线程发送任何信号,例如SIGUSR1。选择with,然后返回负值,errno将设置为EINTR。但是在Windows端没有类似的功能。

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


仅在Unix端,可以使用pthread_kill向等待的线程发送任何信号,例如SIGUSR1。选择with,然后返回负值,errno将设置为EINTR。但在Windows端没有类似的功能。

@Chnossos您不能在Windows上选择管道。是的,我应该指定操作系统目标。@n.m.非常感谢您的这个绝妙想法。@Chnossos您不能在Windows上选择管道。是的,我应该指定操作系统目标。@n.m.非常感谢您的这个绝妙想法。