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);