pthread_barrier不按I';我希望 我在C++中运行,但是我认为同样的代码在C.中也能工作。我对一个障碍的理解是当你使用pthRead BaleRelixIn()时,你给它一个数字。该数字表示在解除阻止任何线程之前必须调用pthread_barrier_wait()的线程数。所以基本上,如果这个数字是4,并且到目前为止有3个线程执行了wait()行,那么所有3个线程都将被阻塞,直到出现第4个线程并调用pthread\u barrier\u wait()

pthread_barrier不按I';我希望 我在C++中运行,但是我认为同样的代码在C.中也能工作。我对一个障碍的理解是当你使用pthRead BaleRelixIn()时,你给它一个数字。该数字表示在解除阻止任何线程之前必须调用pthread_barrier_wait()的线程数。所以基本上,如果这个数字是4,并且到目前为止有3个线程执行了wait()行,那么所有3个线程都将被阻塞,直到出现第4个线程并调用pthread\u barrier\u wait(),c,multithreading,pthreads,C,Multithreading,Pthreads,我试图让所有线程同时开始执行 #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

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

#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
waiting for barrier
passed barrier
passed barrier
passed barrier
passed barrier
发生的另一件非常奇怪的事情是,在我的pthread_barrier_init(barrier,NULL,num_threads)调用中,我可以将数字更改为(num_threads+40),程序仍然运行。我认为在这种情况下,所有线程都将永远坐在wait()调用上,因为不会有num_线程+40个线程在等待

我错过了什么

pthread_barrier_t *barrier;
pthread_barrier_init(barrier, NULL, num_threads);
所以
barrier
是一个指针,它从未指向任何特定的东西。您从未分配
barrier
值,但将其值传递给
pthread\u barrier\u init
。因此,
pthread\u barrier\u init
和线程一样获取一个垃圾值

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

您可以这样做:

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

这实际上创建了一个屏障,并将其地址传递给
pthread\u barrier\u init
,以便可以初始化实际创建的屏障。

在@DavidSchwartz给出的答案中添加了一行额外的内容,以明确指针形式需要如何指向
pthread\u barrier\t
的实际实例。但是,对于非常本地化的使用,更典型的是:

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