Linux io_uring 使用 SPSC 或 MPMC 环形缓冲区吗?

问题描述 投票:0回答:1

Linux io_uring 使用 SPSC 或 MPMC 环形缓冲区吗? 如果它使用 SPSC 那么是否可以在多线程应用程序中使用它?

multithreading linux-kernel io-uring
1个回答
0
投票

我假设您不想使用库 liburing,而是直接访问环形缓冲区。

提交环形缓冲区是单个生产者。即使 head 和 tail 是原子的,也不可能原子地写入提交条目和环形缓冲区尾部索引。此处使用互斥体和/或多生产者辅助队列,以防环形缓冲区繁忙(写入线程始终可能在关键部分内挂起)。另一种解决方案可能是使用多个提交队列。我希望在阅读后更改内核以使提交条目无效。

但是,完成环形缓冲区是多个消费者的。

  • 读取原子头索引。
  • 与原子尾比较。
  • 如果不同:有可用数据。
  • 读取环形缓冲区中的相关完成条目。
  • 如果与下一个头索引的原子比较交换成功,则完成条目有效。
  • 如果没有,则另一个线程已消耗该条目。重试阅读下一个条目。
© www.soinside.com 2019 - 2024. All rights reserved.