c++ - omp_init_lock(omp_lock_t*) - 这个函数究竟做了什么?

标签 c++ linux openmp

# include <iostream>
# include <cstdlib>
# include <omp.h>

#define SIZE 10
#define NUM_THREADS SIZE

using namespace std;

main() {

omp_lock_t lock;
//omp_init_lock(&lock);

srand(time(NULL));  

int arr[SIZE], max = -1;

omp_set_num_threads(NUM_THREADS);

for(int i = 0; i < SIZE; i++)
    arr[i] = rand()%100;

#pragma omp parallel for
for(int i = 0; i < SIZE; i++) {
    omp_set_lock(&lock);
        if(arr[i] > max)
            max = arr[i];
    omp_unset_lock(&lock);
}

cout << "Max: " << max << endl;

这是我编写的代码,用于使用 openMP 锁定功能查找数组中的最大元素。每当我跳过该函数 omp_init_lock 时,我的代码都不会执行。它仍然会成功编译,但我的所有线程在进入 for 循环后都会停止 只要数组的 SIZE 是一个小数字(如 10 或 20)。其他时候它会毫无问题地运行(当数组的大小是一个很大的数字时,比如 100)。

但是 omp_init_lock() 解决了所有问题。如何?我搜索了但找不到太多相关信息。唯一提到的是它将锁初始化为解锁状态。为什么即使我没有初始化锁,当数组大小为 100 时代码仍在运行?

那么omp_init_lock()具体是做什么的呢?

最佳答案

OpenMP 锁可以处于三种可能状态之一:未初始化未锁定已锁定(OpenMP specification 的第 3.3 节| ).当声明但未通过调用 omp_init_lock() 初始化时,锁处于unitialized 状态。调用 omp_init_lock() 将锁转换为解锁 状态。从那时起,可以先使用 omp_set_lock() 锁定,然后使用 omp_unset_lock() 解锁

对处于未初始化 状态的锁调用omp_set_lock() 是错误的(第 3.3.4 节)。在未处于锁定状态(包括未初始化)的锁上调用omp_unset_lock() 也是错误的(第 3.3.5 节)。

如果您的程序在特定条件下工作而没有正确初始化锁是未指定的行为

关于c++ - omp_init_lock(omp_lock_t*) - 这个函数究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40770263/

相关文章:

c++ - Visual Studio : Static Link to Static Library

c++ - 将参数传递给父类(super class)构造函数

c++ - 在 DirectX 10 中导入 .x 模型

c - openmp simd 失败

c++ - OpenMP 并行化抑制矢量化

c++ - Nouveau 内核在 Allegro5-C++ 上拒绝了 Pushbuf

linux - 如何在 Linux 中仅取消保护一个文件夹的密码

linux - RPM 无法遵循安装时的依赖顺序

C 错误 : free(): invalid next size (fast):, C 程序在 OSX、Linux 上的不同行为

concurrency - 使用 OpenMP 的数组中的最大值