openmp - OpenMP 中的双重释放或损坏

标签 openmp

我正在尝试实现并行强力子字符串搜索算法。每个线程都有一个开始和结束索引,由于我使用 4 个线程运行它,因此每个线程将完成四分之一的工作。

现在,当我运行该函数一次时,一切都很好(适用于 4 个线程),但是由于该函数是 void 类型,因此我将结果(子字符串位于较大字符串中的索引)存储在全局变量“ans”。

int ans = -1;

void bruteForce(string mainString, string subString)
{
    int tid, nthreads;
    #pragma omp parallel private (tid) shared (nthreads, ans)
    {
        tid = omp_get_thread_num();
        nthreads = omp_get_num_threads();
        int j = 0;
        int start = tid * (mainString.size() / nthreads);
        int end = start + mainString.size() / nthreads;

        for(int i = start; i < end; i++)
        {
            if(ans == -1)
            {
                while(j < subString.size())
                {
                    if(mainString[i + j] != subString[j]) break;
                    if(j == subString.size() - 1)
                    {
                        #pragma omp critical
                        {
                            #pragma omp flush
                            ans = i;
                        }
                    }
                    j++;
                }
                j = 0;
            }
        }
    }
}

我想要做的是在函数完成之后或开始之前将“ans”重置为-1,但是当我尝试这样做时,我收到此错误以及内存映射和回溯。

double free or corruption (out): 0xb5b00468 ***

是否有原因导致我无法在下面的 for 循环中将 'ans' 更改为 -1?

    start = get_timestamp();
    for(int x = 0; x < N; x++)
    {
        show_percent(x, N);
        bruteForce(STRING, WORD);
    }
    end = get_timestamp();

最佳答案

这与更改 ans 无关。您需要在 brutForce() 的 while 循环中对 (i+j) 进行限制。

说 mainString = "THIS"和 subString="XXX"。 所以每个线程都会得到

T | H | I | S

对于最后一个线程,您的 start=3,end=4。还有 subString.size() = 3;

所以在 while 循环中,您正在访问 mainString[i+j],其中 j = 0->2 ==> (i+j) = 3->5。

关于openmp - OpenMP 中的双重释放或损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15724432/

相关文章:

c++ - 找不到 Xcode C++ omp.h 文件

c - 我如何要求 OpenMP 在每次运行程序时只创建一次线程?

OpenMP 编程 : How to specify the number of threads as a command line option

c++ - Makefile 忽略命令 export OMP_NUM_THREADS

c - 是否可以使用并行 Travelsar 在二叉搜索树中查找元素

c++ - 创建 3D 网格时嵌套 for() 循环上的 OpenMP

gcc - GCC 编译器可以使用 nVidia GPU 来加速编译和/或链接吗?

c - OpenMP 中循环的矢量化

c++ - OpenMP 优化 for 循环的调度

c++ - For 循环中的 OpenMP 并行部分 (C++) - 开销