【发布时间】:2021-06-12 15:03:06
【问题描述】:
假设许多线程尝试在动态分配数组的末尾追加元素。如果没有足够的空间,数组必须重新分配,但是它在内存中的地址可能会改变,其他线程必须知道这个改变。假设我们有以下顺序代码:
int capacity = 0;
int len = 0;
double *A = NULL;
for (int i = 0; i < n; i++) {
/* get a stuff array with impredictably many elements */
int k = foo(i); // determine number of elements
double stuff[k];
bar(i, k, stuff); // fill the stuff array
/* Append stuff at the end of A */
if (len + k > capacity) { // not enough space in A? Realloc twice the size
capacity = 2*capacity + k;
A = realloc(A, capacity * sizeof(*A)); // pointer may change
}
for (int j = 0; j < k; k++) // copy
A[len++] = stuff[j];
}
我想并行化循环的迭代。 foo 和 bar 是线程安全的。我想尽量减少临界区的使用。特别是,我想把复制循环排除在外。
一个可能的解决方案是使用一个公平读写器锁。线程将写入-获取锁以重新分配数组,并在复制循环期间持有读取锁。如果一个线程等待写锁,它应该阻止其他线程获取读锁。
在纯 OpenMP 中执行此操作的最佳方法是什么?
【问题讨论】:
-
嗨,Charles,您还有其他问题吗,很遗憾,我认为 OpenMP 不适合此类问题
标签: c multithreading concurrency parallel-processing openmp