我正在研究一些并行加载一系列图像的代码。需要对图像的中值进行归一化以匹配所有其他图像的背景。为此,我将其中一个图像计算为中位数。然后我将所有其他图像中值的值移动到匹配。我不想要连续加载第一张图片的开销,所以我提出了以下代码。
pixel_t bg;
bool bgset = false;
#pragma omp parallel for schedule(dynamic, 1)
for(size_t i = 0; i < list->size; i++)
{
image_t* img = load(list->file_names[i]);
if(bias)
image_subtract_dark(img, bias);
if(dflat)
image_subtract_dark(img, dflat);
if(!bgset)
{
#pragma omp critical
{
if(!bgset)
{
stack_assert(image_median(img, &bg) == SUCCESS, "Out of Memory");
bgset = true;
#pragma omp flush(bgset)
}
}
}
stack_assert(image_normalize_median(img, bg) == SUCCESS, "Out of Memory");
#pragma omp critical
{
stack_printf("Stacking flat frame [%s]\n", list->file_names[i]);
stack_assert(accumulator_add(accum, img) == SUCCESS,
"Accumulation Error, (May be out of Memory)");
}
image_free(img);
}
正如你在这里看到的那样,我首先通过检查bgset是否为假来避免障碍和cirticical部分的开销。在第一个线程通过该部分后,bgset将在大多数情况下成立。然后在第一个if语句中,我再次在该关键部分内检查bgset,以防另一个线程发生改变,而当前的一个线程正在等待进入临界区。最后,如果我的线程是设置bg的线程,它将进入区域,设置背景,设置标志,并刷新其值。我想知道的是,如果这是我需要冲洗的情况?总的来说,我还能正确地解决这个问题吗?