根据您的要求,我认为您可以使用两个原则:
shared_array<char>
它将处理多线程同步和内存处理
- 每个模块一个队列:这是必要的,因为每个模块都以自己的速度处理图像
然后,一旦你得到一个图像,你就将它分配到一个shared_array<char>
. 然后在所有队列中复制该指针。
每个队列都需要单独同步,但这是一个经典的消费者/生产者的事情,所以你可能会(非常)轻松地对其进行编程,特别是因为每个队列只有一个生产者(接收图像的线程)和一个消费者。
举个例子:让我们采用 3 个模块,一个是快速的,一个是中等的,最后一个使用 3 x 3 的图像。
=> receiving image 1
module a: ['1'] -> processing (none)
module b: ['1'] -> processing (none)
module c: ['1'] -> processing (none)
=> modules a, b starts treatment of '1'
module a: [] -> processing '1'
module b: [] -> processing '1'
module c: ['1'] -> processing (none)
=> receiving image 2
module a: ['2'] -> processing '1'
module b: ['2'] -> processing '1'
module c: ['2', '1'] -> processing (none)
=> module a finishes treatment of '1', starts treatment of '2'
module a: [] -> processing '2'
module b: ['2'] -> processing '1'
module c: ['2', '1'] -> processing (none)
=> receiving image 3
module a: ['3'] -> processing '2'
module b: ['3', '2'] -> processing '1'
module c: ['3', '2', '1'] -> processing (none)
=> module c starts treatment of '1', '2' and '3'
module a: ['3'] -> processing '2'
module b: ['3', '2'] -> processing '1'
module c: [] -> processing '1', '2' and '3'
=> module a finishes treatment of '2', starts treatment of '3'
=> module b finishes treatment of '1', starts treatment of '2'
=> module c finishes treatment of '1' and '2', keeps '3' for future batch
module a: [] -> processing '3'
module b: ['3'] -> processing '2'
module c: [] -> processing '3' (waiting)
--> at this point '1' is deleted from memory
如果每个模块(线程)在“池”中注册其队列,您甚至可以使这个“简单”。
我还建议发信号,我一直认为最好让生产者发信号表明已插入新项目(如果队列为空),让消费者线程不断轮询队列......