首先,对问题和解决方案进行高级描述。
我有一个包含图像及其每个图像中像素位置的列表 - 一个列表的列表。我想从该图像列表中随机挑选n个项目,并对每个图像迭代k个随机像素位置。我希望并行执行此操作。对于每个处理的像素,我希望将其从列表中删除。
我的方法是在所有线程之间分配图像和像素列表 - 因此每个线程都有自己的图像列表和像素位置列表,但没有两个线程会同时处理同一张图片。我将它们存储到一个向量中。
因此,假设代码看起来像这样:
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不是线程安全的,但我非常确定对于仅由一个线程访问的主列表中的每个列表的列表,它是安全的。 我知道我提供了有限的代码,但问题归结为在并行情况下从列表的列表(或列表的向量)中进行删除,当每个线程一次只有一个列表的访问权限且列表在各个线程之间不共享时。
我错过了什么? 我不能在并行环境中从列表的列表中删除吗?