C++ 为QtConcurrent::mapped中的每个线程使用独立资源

C++ 为QtConcurrent::mapped中的每个线程使用独立资源,c++,qt,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) { //.....

我正在通过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


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


  //lots of codes
}
在函数过程\u image\u impl中,我调用了一个名为“形态学”的类,我不想 当我处理图像时锁定“形态学”类,但是如果我不锁定它,我可能会 导致未定义的行为。我不想锁定进程,而是将 对容器中的“形态学”进行分类,并根据
QThreadPool中的线程,这是可能的吗?或者您有其他建议吗?谢谢

多线程是可能的解决方案之一,这取决于调用“形态学”类的次数、运行代码时使用的操作系统以及使用的处理器等等。所有这些都会影响代码在运行时的性能,这取决于您的预期。如果您想采用多线程方法,那么只需创建一个指向“形态学”类的指针和另一个指向“QThread”的指针,然后使用“moveToThread(&thread)”将其移动到线程。例如,请检查此链接:

另外,如果您希望您的程序具有响应性,并且在处理过程中不被锁定,那么多线程也是一种方法,前提是只需要在线程内访问形态学
qt存储形态;
无效进程\u图像\u impl(整数图像\u id){
//很多代码
如果(!mophy.hasLocalData())mophy.setLocalData(mophy());
形态学.localData().close(图像,图像);
//很多代码
}
如果还需要在线程外部访问形态学
模板
类ThreadSafeStack:private QStack{
QMutex互斥;
公众:
T*pop(){
QMutexLocker锁柜(&mutex);
return!isEmpty()?QStack::pop():new T;
}
无效推送(T*&T){
QMutexLocker锁柜(&mutex);
QStack::push(t);
}
};
线程安全堆栈;
无效进程\u图像\u impl(整数图像\u id){
//很多代码
形态学*形态学=stack.pop();
形态学->关闭(图像,图像);
叠加推(形态学);
//很多代码
}

我认为您需要研究线程本地存储,但Qt没有跨平台的实现,因此您需要使用平台的本地存储。
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
}
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
}