为什么当套接字变得可读时,10个选择进程中只有2个被通知



在我的应用程序中有10个进程共享一个套接字。

他们都在等待它使用select变得可读。

但我在应用程序日志中注意到,在套接字变得可读时,这10个进程中只有2个进程。

原因可能是什么?

I怀疑发生的情况是,第一个进程正在唤醒,从select()返回,并在后续上下文切换到其他进程之前调用accept()。

我不确定select()到底阻塞了什么,也不知道它是如何唤醒的。我怀疑当它从等待中醒来时,它会重新检查队列,看看数据是否仍然可用。如果没有,则返回等待。

我也会加倍强调我的假设。2个进程正在唤醒这一事实表明您有一个双核处理器。如果你有一个四核,你可能会看到多达4个进程同时唤醒。

证明这一理论的一个简单方法是:在调用accept()之前进行一个2秒的sleep()调用。我怀疑您会看到所有10个进程都在唤醒并记录呼叫accept的尝试。

如果您的目标是让N个进程(或线程)为传入连接提供服务,那么您的方法可能仍然很好。您可能会从对非阻塞套接字执行select()调用切换到只使用直接调用accept()的阻塞套接字。当传入连接进入时,其中一个进程将从accept()返回一个有效的客户端套接字句柄。其他人仍将被封锁。

最新更新