eventfd,添加写入套接字的值

Posted

技术标签:

【中文标题】eventfd,添加写入套接字的值【英文标题】:eventfd, adds values written to socket 【发布时间】:2020-07-04 11:37:30 【问题描述】:

以下是问题,

我有一个监听线程,它监听并接受新的连接。 一旦被接受,我使用 eventfd 将套接字描述符传递给其他四个工作线程。 listener 是创建一个 eventfd 的那个,所有工作线程读取的都是一样的。

现在的问题是,当多个客户端连接到服务器时,服务器侦听器接受连接,并写入 eventfd,其中一个工作线程接收两个不同套接字的总和。 例如,如果在套接字 10 和 11 上接受了两个连接,则其中一个工作人员会收到 21。

现在,它可能是设计使然,但是,这对我来说毫无意义,为什么写入不是队列而不是被添加。

如有错误请指正,如果有人想查看示例代码,请告诉我。

【问题讨论】:

能否提供示例代码。 【参考方案1】:

您为这项工作使用了错误的工具。 eventfd()发生了什么事通知工具,而不是发生了什么事;这是相关数据工具。

当您向 eventfd 写入一个新的 64 位整数值时,它会添加到与该事件关联的当前数字中。从描述符中读取会为您提供当前数字并将其重置为 0(假设您没有使用信号量模式)。所以如果你写了两次然后才读,你会得到你描述的行为。

您应该使用队列或其他机制将套接字描述符传递给您的线程。

【讨论】:

我可以使用队列,但它会在等式 eventfd 中引入竞争,如果它达到了我的预期,那么实现方式会更清晰、更高效。我认为正如你所说,这是设计使然,如果有一种机制可以实现我所解释的,我会很高兴的。 @SushilLakra 当然,它必须是一个线程安全的队列结构。像 socketpair() 这样简单的数据报可能会起作用。 许多其他选择之一是让多个线程调用accept();一次只有一个人会获得新的连接。 我想要实现的目标有很多解决方案,但是您的回答足以让我重新评估实施,因为 eventfd 不足以满足我的目的。 感谢您的帮助,我们非常感谢您及时回复。

以上是关于eventfd,添加写入套接字的值的主要内容,如果未能解决你的问题,请参考以下文章

select() 是不是可以实现单套接字读/写超时?

将 Spark 流输出写入套接字

在apache tomcat中将字节写入Web套接字时写入超时

在 C 或 C++ 中的同一个套接字上同时读取和写入

全双工套接字与使用的两个套接字,一个用于读取,另一个用于写入

异步写入套接字线程是不是安全?