gpt4 book ai didi

c - pthread_barrier 不符合我的预期

转载 作者:行者123 更新时间:2023-12-02 06:49:20 25 4
gpt4 key购买 nike

我在 C++ 中运行它,但我认为相同的代码可以在 C 中运行。我对屏障的理解是,当你 pthread_barrier_init() 时,你给它一个数字。该数字表示有多少线程必须调用 pthread_barrier_wait() 才能解除阻塞。所以基本上,如果数字是 4,并且到目前为止有 3 个线程执行了该 wait() 行,那么所有 3 个线程都将被阻塞,直到第 4 个线程出现并调用 pthread_barrier_wait()。

我试图让所有线程同时开始执行。

#include <pthread.h>
#include <stdio.h>

void* thread_func(void* args) {
pthread_barrier_t *barrier = (pthread_barrier_t*)args;
printf("waiting for barrier\n");
pthread_barrier_wait(barrier);
printf("passed barrier\n");

return NULL;
}

int main() {
int const num_threads = 4;
pthread_t threads[num_threads];
pthread_barrier_t *barrier;

pthread_barrier_init(barrier, NULL, num_threads);

int i;
for (i = 0; i < num_threads; i++) {
pthread_create(&threads[i], NULL, thread_func, (void*)barrier);
}

for (i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}

return 0;
}

我收到的输出:

waiting for barrier
waiting for barrier
waiting for barrier
passed barrier
passed barrier
passed barrier
waiting for barrier
passed barrier

我期望的输出:

waiting for barrier
waiting for barrier
waiting for barrier
waiting for barrier
passed barrier
passed barrier
passed barrier
passed barrier

另一件非常奇怪的事情是,在我的 pthread_barrier_init(barrier, NULL, num_threads) 调用中,我可以将数字更改为 (num_threads+40) 并且程序仍然运行。我认为在那种情况下,所有线程都将永远等待它们的 wait() 调用,因为永远不会有 num_threads+40 个线程在等待。

我错过了什么?

最佳答案

pthread_barrier_t *barrier;
pthread_barrier_init(barrier, NULL, num_threads);

所以 barrier 是一个指针,从来没有专门指向任何东西。您永远不会为 barrier 分配一个值,但您将其值传递给 pthread_barrier_init。所以 pthread_barrier_init 得到一个垃圾值,你的线程也是如此。

在某个地方,您需要创建一个实际的障碍,而不仅仅是指向障碍的指针。

你可以这样做:

pthread_barrier_t actual_barrier;
pthread_barrier_t *barrier = &actual_barrier;
pthread_barrier_init(barrier, NULL, num_threads);

这实际上确实创建了一个屏障并将其地址传递给 pthread_barrier_init 因此您实际创建的屏障可以被初始化。

关于c - pthread_barrier 不符合我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48935786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com