我已经pthread_create
创建了4个主题。我希望它们在同一时间开始运行,所以我在线程过程的最开始添加sem_wait(&sem)
。在主线程中,我可能会使用类似的东西,但我不认为这是一个很好的解决方案:
for (int i = 0; i < 4; i++)
{
sem_post(&sem);
}
我用Google搜索并找到pthread_cond_t
。但是,pthread_cond_broadcast
只能唤醒当前正在等待的线程。即使我在过程的最开始处放置pthread_cond_wait
,仍然无法保证在pthread_cond_wait
之前调用pthread_cond_broadcast
(在主线程中)。
为了避免这种情况,我必须添加许多其他代码,以确保wait
和broadcast
的调用顺序,这也是不聪明的。
那么,是否有一种简单的方法来“排列”所有线程(让它们同时开始运行)?
似乎有一个sem_post_multiple
,但它是pthread中的win32扩展。我使用的是Linux(Android)。
答案 0 :(得分:3)
您正在寻找障碍
pthread_barrier_t
用线程数(n)初始化它,然后用每个线程调用pthread_barrier_wait()。此调用将阻止执行,直到n个线程到达屏障。
示例:
int num_threads = 4;
pthread_barrier_t bar;
void* thread_start(void* arg) {
pthread_barrier_wait(&bar);
//...
}
int main() {
pthread_barrier_init(&bar,NULL,num_threads);
pthread_t thread[num_threads];
for (int i=0; i < num_threads; i++) {
pthread_create(thread + i, NULL, &thread_start, NULL);
}
for (int i=0; i < num_threads; i++) {
pthread_join(thread[i], NULL);
}
pthread_barrier_destroy(&bar);
return 0;
}