我正在搜索解决方案以在c ++中唤醒选择调用,根据应用程序要求,由于使用select系统调用的多线程,我无法设置超时。
请参阅下面的情景。
我想唤醒选择系统调用等待其他线程。我试图从主线程中写入线程上的数据,但仍然无法唤醒它。
如果此线程上有空数据,我想关闭线程和套接字。
如果套接字连接与其他进程关闭,则唤醒select select,但不使用线程。
有没有人知道这个
答案 0 :(得分:3)
在最近的Linux上,您可以使用eventfd
,在一般情况下 - 管道,用法 - 在选择器中注册管道的一侧以提供可读性以及实际套接字,以唤醒选择器 - 只需将一个字节写入管道的另一端。或者(如果你的libc有它),你可以使用带有sigmask的pselect
来捕获ALRM
信号,并在需要唤醒选择器时发出该信号。在多线程应用程序中使用信号方法要非常小心(因为"我不会使用"),好像没有正确完成信号可以传递给随机线程。
答案 1 :(得分:-1)
感谢所有宝贵的建议,我能够使用shutdown()上的参考答案解决套接字FD上的link调用问题,它会将唤醒信号传递给select,等待行动。我们应该在选择调用后才关闭套接字,否则select将无法获得唤醒信号。