0

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 で、「morphology」というクラスを呼び出します。画像を処理するときにクラス「morphology」をロックしたくないのですが、ロックしないと未定義の動作が発生する可能性があります。プロセス、クラス「形態」をコンテナに入れ、QThreadPool のスレッドに従って「形態」のそれぞれを呼び出したいのですが、これは可能ですか?それとも他の提案はありますか?ありがとう

4

2 に答える 2

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
}
于 2014-02-05T00:25:41.893 に答える