omp_init_lock(omp_lock_t*) - 这个函数的功能是什么?

Add*_*y K 1 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;
Run Code Online (Sandbox Code Playgroud)

}

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

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

那究竟是omp_init_lock()做什么的呢?

Hri*_*iev 5

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

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

您的程序在特定条件下工作而未正确初始化锁定是一种未指定的行为.