我认为(也基于您对 Maciek 的评论)您必须首先了解线程和进程之间的区别以及它们如何通信。
关于设计问题:尝试从简单的设计开始。例如,仅使用线程并使用其自己的同步队列*将每个订阅者传递给作业的 shared_ptr。由于对数据的访问是只读的,并且 AFAICR,boost::shared_ptr 对于这种使用是多线程安全的,因此没有同步问题并且数据被自动清理。不要担心内存重新分配(还),只需确保每个订阅者/线程使用有限的内存量(o(1))(如您所说,最多大约 51 个 shared_ptrs)。
当您拥有这个工作框架时,您将能够根据遇到的问题开始优化。如果重新分配是问题所在,您可以移动到环形缓冲区(如 bcat 所建议的那样)。或者您可以用池分配器替换您的分配器(/new 运算符)。如果您有很多订阅者,将队列合并为一个供所有线程使用的单个队列可能会很有效。这样做需要更多信息(如果一个线程由于计算时间很长而非常慢怎么办?你有什么方法可以通知它停止处理吗?或者队列是否应该增长?如果是这种情况,循环缓冲区可能不起作用很好......)并且可能有它的复杂性,但请记住,我们只是试图保存由 shared_ptrs 占用的房间(而不是工作)。
底线,尽量避免过早的优化。取而代之的是,在设计中以合理的优化和可扩展性编写它,然后根据您所学的内容从那里继续。
祝你好运
* 同步队列 - 线程之间的队列。push(j) 添加作业,pop() 等待队列不为空并返回顶部作业(与 stl::queue 不同。当队列被多个线程读取时,这一点很重要)。我通常通过包装一个 stl::queue 并使用 boost::mutex 保护它来实现它。