如何使用TBB/OpenMP锁定数组元素

How to lock element of array using TBB/OpenMP

本文关键字:锁定 数组元素 OpenMP 何使用 TBB      更新时间:2023-10-16

我有一个由多个线程读取/写入的非常大的数组。每个线程一次只遍历其中的一个元素,所以锁定整个数组是个坏主意。我期待的是类似的东西

// 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_lockrelease_lock的最佳策略是什么?

使用OpenMP时,可以使用atomic构造获得等效行为:

// during threads
#pragma omp atomic
array[element_id]+=10; // some operations

为了让您了解它的语义,这里摘录了OpenMP 3.1标准:

原子构造可确保特定的存储位置以原子方式访问,而不是将其暴露在多个同时读取和写入线程,可能导致不确定值

另一方面,如果您决定使用Intel TBB,您可以查看原子模板类。