- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
# 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/
我的目标是将线程对数组的单个元素的访问限制为一次只有一个线程。为此,我使用 OpenMP 锁原语。但是,如果 Num_Items 是动态的并且在代码编译之前未知怎么办?看来 omp_lock_t 只接
# include # include # include #define SIZE 10 #define NUM_THREADS SIZE using namespace std; main(
我假设我能够创建 2 个不同的 omp_lock_t,并彼此独立地锁定它们。我用 gcc 4.4 和 gcc 4.6.1 测试了以下代码部分并得到了相同的输出: omp_lock_t lockA; o
我是一名优秀的程序员,十分优秀!