如何在没有超时期限的情况下从另一个线程唤醒 Select 调用

How to wakeup Select call without timeout period from another thread

我正在寻找在 C++ 中唤醒 select 调用的解决方案,根据应用程序要求,我无法设置超时,因为多个线程使用 select 系统调用。

请看下面的场景。

我想唤醒 select 等待其他线程的系统调用。我试图从主线程在线程上写入数据,但它仍然无法唤醒它。

如果这个线程上有空数据,我想关闭线程和套接字。

如果套接字连接与其他进程关闭,但未使用线程,则唤醒 select 调用。

有没有人对此有想法

在最近的 Linux 中,您可以在一般的所有事物上使用 eventfd - 管道,用法 - 在选择器中注册管道的一侧以便与实际套接字一起使用,唤醒一个选择器——只需将一个字节写入管道的另一端。或者(如果你的 libc 有它)你可以使用 pselect 和一个 sigmask 来捕捉 ALRM 信号并在你需要唤醒选择器时发出该信号。在多线程应用程序中使用信号方法时要非常小心(如 "I would not use"),因为如果操作不当,信号可能会传递到随机线程。

感谢大家的宝贵建议,我可以用shutdown() call on socket FD using reference answer present on this link解决问题,它会将唤醒信号传递给select,等待操作。我们应该只在 select 调用后关闭套接字,否则 select 将无法获得唤醒信号。