ギャング。まず、問題とアプローチの概要を説明します。
画像と各画像のピクセル位置を含むリスト(リストのリスト)があります。その画像のリストからランダムにn個のアイテムを選択し、画像ごとにk個のランダムなピクセル位置を反復処理します。これを並行してやりたいです。処理されたピクセルごとに、リストから削除したいと思います。
私のアプローチは、画像とピクセルリストをすべてのスレッドに分散することです。したがって、各スレッドには独自の画像リストとピクセル位置のリストがありますが、2つのスレッドが同じ画像を同時に処理することはありません。これらをベクトルに格納します。
したがって、コードが次のようになっているとしましょう。
struct MyObject
{
// Image index on disk
int imageIndex_;
// List of x,y locations
std::list< Point > pixels_;
};
std::vector< std::list < MyObject > > mainList(NUM_THREADS);
次に、mainList[0]
ID 0のスレッドで処理される画像が含まれます。次の方法でスレッドを起動します。#pragma omp parallel num_threads(numThreads_)
次に、スレッドの画像リストからランダムに画像をサンプリングする同じコードを実行します。
問題は、ピクセルが処理され、スレッドがピクセルリストからピクセルを消去するときに、たとえばmainList[0].begin()->pixels_.erase(someIter)
、アサーションを取得することがあることです。削除演算子までトレースします。
std :: listへの書き込みはスレッドセーフではないことは知っていますが、メインリストの各リストに1つのスレッドのみがアクセスする、リストのリストに対しては安全であると確信していました。限られたコードを提供したことは知っていますが、問題は、各スレッドが一度に1つのリストにしかアクセスできず、リストがスレッド間で共有されていない場合に、リストのリスト(またはリストのベクトル)から並行して削除することになります。
ここで何が欠けていますか?リストのリストのベクトルから並行して削除することはできませんか?