如何使用TBB/OpenMP锁定数组元素
How to lock element of array using TBB/OpenMP
我有一个由多个线程读取/写入的非常大的数组。每个线程一次只遍历其中的一个元素,所以锁定整个数组是个坏主意。我期待的是类似的东西
// before threads
lock_t Lock[NUM_THREADS];
...
// during threads
get_lock(Lock[thread_id], element_id);
array[element_id]+=10; // some operations
release_lock(Lock[thread_id]);
所以我的问题是,设计get_lock
和release_lock
的最佳策略是什么?
使用OpenMP时,可以使用atomic
构造获得等效行为:
// during threads
#pragma omp atomic
array[element_id]+=10; // some operations
为了让您了解它的语义,这里摘录了OpenMP 3.1标准:
原子构造可确保特定的存储位置以原子方式访问,而不是将其暴露在多个同时读取和写入线程,可能导致不确定值
另一方面,如果您决定使用Intel TBB,您可以查看原子模板类。
相关文章:
- 数组元素打印的递归方法
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 数组元素更改值?
- 如何访问宏中定义的数组元素
- 将数组元素递增 1
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在 std::map 中插入数组元素
- 使用指针访问数组元素时出现意外结果
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 缺少数组元素问题
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 删除在结构 c++ 中声明的数组元素
- Getter 和 Setter 用于类 C++ 中的数组元素
- 尝试递归获取数组元素的总和
- 如何使用TBB/OpenMP锁定数组元素