【发布时间】:2021-12-02 08:21:51
【问题描述】:
我正在尝试将我正在并行化的函数与 pthread 同步。
问题是,我遇到了死锁,因为一个线程将退出函数,而其他线程仍在等待退出的线程到达屏障。我不确定 pthread_barrier 结构是否能解决这个问题。这是一个例子:
static pthread_barrier_t barrier;
static void foo(void* arg) {
for(int i = beg; i < end; i++) {
if (i > 0) {
pthread_barrier_wait(&barrier);
}
}
}
int main() {
// create pthread barrier
pthread_barrier_init(&barrier, NULL, NUM_THREADS);
// create thread handles
//...
// create threads
for (int i = 0; i < NUM_THREADS; i++) {
pthread_create(&thread_handles[i], NULL, &foo, (void*) i);
}
// join the threads
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(&thread_handles[i], NULL);
}
}
这是我为 foo 尝试过的解决方案,但它不起作用(注意 NUM_THREADS_COPY 是 NUM_THREADS 常量的副本,并且每当线程到达函数末尾时递减):
static void foo(void* arg) {
for(int i = beg; i < end; i++) {
if (i > 0) {
pthread_barrier_wait(&barrier);
}
}
pthread_barrier_init(&barrier, NULL, --NUM_THREADS_COPY);
}
当线程退出函数时,是否有更新在屏障中等待的线程数的解决方案?
【问题讨论】:
-
为什么同时标记为 [c] 和 [c++]?您实际使用的是哪种语言?