我有一个非常大的数组读/写几个线程。每个线程一次只会丢掉它们中的一个元素,因此锁定整个数组是个坏主意。我期待的是像
// 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
的最佳策略是什么?
答案 0 :(得分:1)
使用OpenMP时,您可以使用atomic
构造获得等效行为:
// during threads
#pragma omp atomic
array[element_id]+=10; // some operations
只是为了让您了解它的语义,这里是OpenMP 3.1标准的摘录:
原子构造确保特定的存储位置 原子地访问,而不是暴露它的可能性 可能导致多个同时读写线程 不确定的值
另一方面,如果您决定使用英特尔TBB,您可以查看atomic template class。