这个多线程代码是否安全(OpenMP)

时间:2015-11-19 12:16:52

标签: c multithreading openmp

我正在研究一些并行加载一系列图像的代码。需要对图像的中值进行归一化以匹配所有其他图像的背景。为此,我将其中一个图像计算为中位数。然后我将所有其他图像中值的值移动到匹配。我不想要连续加载第一张图片的开销,所以我提出了以下代码。

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的线程,它将进入区域,设置背景,设置标志,并刷新其值。我想知道的是,如果这是我需要冲洗的情况?总的来说,我还能正确地解决这个问题吗?

0 个答案:

没有答案