c++ - 如何处理 OpenMP 并行代码中的返回?

标签 c++ c multithreading parallel-processing openmp

我的需求是这样的:每个线程自己分配内存,然后处理:

typedef struct
{
    ......
}A;

A *p[N];

#pragma omp parallel
{
    #pragma omp for
    for (int i = 0; i < N; i++) {
        p[i] = (A*)calloc(sizeof(*p[i]), N);
        if (NULL == p[i]) {
            return;
        }
        ......          
    }
}

但是编译器会报错:

error: invalid exit from OpenMP structured block
     return;

所以除了将分配内存的代码放在#pragma omp parallel之外:

for (int i = 0; i < N; i++) {
    p[i] = (A*)calloc(sizeof(*p[i]), N);
    if (NULL == p[i]) {
        return;
    }       
}
#pragma omp parallel
{
    #pragma omp for
    ......
}

有没有更好的方法?

最佳答案

我想你正在寻找这个:

#pragma omp parallel
{
    #pragma omp for
    for (int i = 0; i < N; i++) {
        p[i] = (A*)calloc(sizeof(*p[i]), N);
        if (NULL == p[i]) {
            #pragma omp cancel for
        }
        ......          
    }
}

但是您需要将环境变量 OMP_CANCELLATION 设置为 true 才能正常工作。

不过,您应该尽量避免这样做,因为取消的费用很高。

关于c++ - 如何处理 OpenMP 并行代码中的返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41886513/

相关文章:

c++ - 从 vector 中正确访问对象的属性并将其清除

c - 运行 C 程序备份 Linux 文件

java - dao 作为 servlet 的成员 - 正常吗?

multithreading - 如何在使用 golang 创建的 wasm 中实现多线程?

c++ - 修改 vector 引用。什么无效?

c++ - 使用Qt对音频声音的回声效果

c++ - 我们能否使用位操作来确定 0 在数组中是否出现奇数次

c - 有没有一种好方法可以改变用 fork() 创建的子进程的执行顺序?

c - malloc 分配的数组太长

java - 重新检查 "synchronized"锁的可变引用?