我的应用程序中有10个进程共享套接字。
他们都在等待select
可以阅读。
但是我在应用程序日志中注意到,只要套接字变得可读,这10个进程中只有 2 。
可能是什么原因?
答案 0 :(得分:3)
我怀疑正在发生的事情是第一个进程正在唤醒,从select()返回,并在后续上下文切换到其他进程之前调用accept()。
我不确定select()实际阻塞了什么或者它是如何唤醒的。我怀疑当它从它正在等待时醒来,它会重新检查队列以查看数据是否仍然可用。如果没有,它会回到等待。
我也会对我的假设进行双重考虑。 2个进程正在唤醒的事实表明您拥有双核处理器。如果你有一个四核,你可能会看到最多同时唤醒4个进程。
证明这一理论的一种简单方法:在调用accept()之前进行2秒sleep()调用。我怀疑你会看到所有10个进程醒来并记录尝试呼叫接受。
如果您的目标是让N个进程(或线程)为传入连接提供服务,那么您的方法可能仍然很好。您可能可以从在非阻塞套接字上执行select()调用切换到仅使用直接调用accept()的阻塞套接字。当传入连接进入时,其中一个进程将从带有有效客户端套接字句柄的accept()返回。其他人仍将被阻止。