【发布时间】:2015-09-05 15:18:28
【问题描述】:
我正在尝试编写一个简单的程序来使用屏障来等待创建多个线程,然后再从主打印消息。
这是我的代码:
#include <iostream>
#include <pthread.h>
#include <stdio.h>
#include <cstdlib>
#include <cstdint>
#define NUM_THREADS 8
pthread_barrier_t barrier;
void *threadFun(void *tid)
{
intptr_t temp = (intptr_t) tid;
printf("Hello from thread %d\n", temp);
}
int main()
{
pthread_t threads[NUM_THREADS];
int rc;
pthread_barrier_init(&barrier, NULL, NUM_THREADS);
for(int i = 0; i < NUM_THREADS; ++i) {
rc = pthread_create(&threads[i], NULL, threadFun, (void *) i);
if(rc) {
printf("Error creating thread %d\n", i);
exit(-1);
}
}
pthread_barrier_wait(&barrier);
printf("Hello from main!\n");
for(int i = 0; i < NUM_THREADS; ++i) {
pthread_join(threads[i], NULL);
}
pthread_barrier_destroy(&barrier);
return 0;
}
目前,我的程序打印了一些不确定的“Hello from thread”语句,并在打印“Hello from main!”之前挂起;但是,它总是打印 8 条线程消息。因此,创建了所有线程。
为什么还挂着?
【问题讨论】:
-
是不是省略了
threadFun在屏障上等待的部分? -
@pilcrow 我在
threadFun的printf之前添加了一个pthread_barrier_wait(&barrier);,但它仍然挂起。这次我看到了“来自 main 的你好!”接着是 7 “Hello from thread” 语句。 -
如果你想让屏障等待你的 8 个工作线程和等待主线程,那么屏障需要设置为 9 个线程,而不是 8 个(以及所有线程需要在屏障上等待,但听起来您已经进行了更改)。
标签: c++ multithreading pthreads barrier