首页 > 解决方案 > 图像处理中的并发设计

问题描述

我是这个主题的新手,我需要为包含以下任务的程序设计并发:

  1. 从数据库加载图像(100ms)
  2. 查找图像的一些元数据(50ms)
  3. 将图像转换为灰度。(100 毫秒)
  4. 查找灰度图像中的所有对象。(600 毫秒)
  5. 裁剪包含对象的图像部分。(100ms/对象)
  6. 将数据(原始图像、元数据和新裁剪的图像)保存在数据库中(100 毫秒)

我如何设计程序以并发方式运行?

我发现第2步独立于第3、4、5、6步,所以可以并行运行如下:

1->2     -> 6
   3->4->5

但是,由于任务 2 只有 50 毫秒,任务 6 需要完成所有任务 2、3、4、5 才能执行。如何指定任务 2 需要“等待”其他任务?

要同时运行,这个问题的合理模式是什么?可能会出现什么样的问题?我正在考虑这样的“管道模式”。但不确定是否有更有效的模式

1->2     -> 6
   3->4->5
   1->2     -> 6
      3->4->5
      1->2     -> 6
         3->4->5
...

标签: c++multithreadingc++11concurrency

解决方案


您可以将工作负载分解为任务之间存在依赖关系的任务。并使用英特尔 Task Scheduler 执行并自动并行化您的工作负载。请参阅教程:基于任务的编程

要获得更多见解,我不能推荐足够多的观看纯线程是当今计算的 GOTO - Hartmut Kaiser - Keynote Meeting C++ 2014


推荐阅读