请教大家一个架构的问题

238 天前
 wisefree

假设有 3 个模块(可能更多),为了提高效率,每个模块一个线程,并绑定到特定 CPU 核心。

  1. 每个模块处理特定的数据,数据长度是已知的
  2. 前一个模块的输出,是后一个模块的输出。比如模块 1 输出,是模块 2 输入;模块 2 输出,是模块 3 输入

当初想法是,模块 1 、模块 2 、模块 3 ,分别在不同线程,则通过也给消息中间件如 zeromq 通信,数据也完全通过消息中间件传输。

现在有一个想法,在模块 1 、模块 2 、模块 3 中,线程启动前,分配好内存空间,消息中间件给各模块传输一个内存指针和数据长度。

  1. 模块 1 中先建立 10 个内存块,处理完毕后,存入第一块内存,然后通知模块 2 ,模块 1 继续处理数据
  2. 模块 2 中也先建立 10 内存块,收到通知后,读取模块 1 的第一块内存地址和数据长度,处理完毕后,存入模块 2 的第一块内存,通知模块 3 ,模块 2 继续处理数据
  3. 模块 3 中也建立 10 块内存块,收到通知后,读取模块 2 的第一块内存地址和数据长度,处理完毕后,存入模块 3 的第一块内存,模块 3 继续处理数据
  4. 依次类推

其中由于模块 1 、模块 2 、模块 3 ,读写并不是同一块内存,所以也不需要加锁等。因为各模块的性能要求很高,在线程中在堆上分配内存都被认为是耗时操作

不知道这种传递内存地址的方式,是不是合适的?有没有更加高效的架构设计呢?

2695 次点击
所在节点    C++
22 条回复
cnbatch
237 天前
忘了一个,如果 OP 的编译器支持 C++17 ,可以考虑下 std::pmr
wisefree
237 天前
@cnbatch 多谢,我去学习这个功能

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1029268

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX