0

我有一个由多个线程读取/写入的非常大的数组。每个线程一次只会 rw 其中一个元素,因此锁定整个数组是个坏主意。我期待的是

// 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

4

1 回答 1

1

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

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

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

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

另一方面,如果你决定使用 Intel TBB,你可以看看atomic template class

于 2013-07-09T16:58:43.113 回答