在QtConcurrent :: mapped中为每个线程使用独立资源

时间:2013-04-23 20:51:25

标签: c++ qt

我正在通过QtConcurrent :: mapped

处理大量数据(1000个或更多)
 auto result = QtConcurrent::mapped(image_id, std::bind<std::pair<QString, QImage>>(&mainWindow::process_image_impl, this, ph::_1));

而不是

void process_image_impl(int image_id)
{
  //.......lots of codes

  {
    QMutexLocker locker(&mutex);
    morphology.close(image, image); //I don't want to lock this operation
  }

  //lots of codes
}

我想做点什么

void process_image_impl(int image_id)
{
  //.......lots of codes


    morphology[thread_id].close(image, image); //I don't want to lock this operation


  //lots of codes
}

在函数process_image_impl中,我调用了一个叫做“形态学”的类,我不想这样做 当我处理图像时锁定类“形态”,但如果我不锁定它我可能 导致未定义的行为。而不是锁定过程,我想把它 在容器中的“形态”类,并根据每个“形态”调用 QThreadPool中的线程可能吗?或者您有其他建议吗?谢谢

2 个答案:

答案 0 :(得分:0)

多线程是可能的解决方案之一,具体取决于您的“形态”类被调用的次数以及您将使用什么操作系统来运行代码以及您将使用的处理器等等。以上所有内容都会影响代码在运行时的性能,这取决于您所期望的内容。如果您想采用多线程方法,您需要做的就是创建一个指向“形态”类的指针,另一个指向“QThread”,然后使用“moveToThread(&amp; thread)”将其移动到线程。例如,请检查此链接:how one should actually and rightfully implement multithreading in Qt

如果你希望你的程序能够响应而不是在处理过程中被锁定,那么多线程也是一种方式

答案 1 :(得分:0)

如果只需要在线程

内访问形态
QThreadStorage<Morphology> morphology;

void process_image_impl(int image_id) {
  //lots of codes
  if (!morphology.hasLocalData()) morphology.setLocalData(Morphology());
  morphology.localData().close(image, image);
  //lots of codes
}

如果需要在线程之外访问形态

template <class T>
class ThreadSafeStack: private QStack<T*> {
  QMutex mutex;
public:
  T* pop() {
    QMutexLocker locker(&mutex);
    return !isEmpty() ? QStack::pop() : new T;
  }

  void push(T* &t) {
    QMutexLocker locker(&mutex);
    QStack::push(t);
  }
};

ThreadSafeStack<Morphology> stack;

void process_image_impl(int image_id) {
  //lots of codes
  Morphology *morphology = stack.pop();
  morphology->close(image, image);
  stack.push(morphology);
  //lots of codes
}