如何在没有超时期限的情况下从另一个线程唤醒 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 将无法获得唤醒信号。
我正在寻找在 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 将无法获得唤醒信号。