C++ 使用pthread唤醒多线程的最佳方法

C++ 使用pthread唤醒多线程的最佳方法,c++,multithreading,pthreads,C++,Multithreading,Pthreads,我通过pthread\u create创建了4个线程。我希望它们同时开始运行,因此我在线程过程的最开始添加sem\u wait(&sem)。在主线程中,我可能会使用类似的方法,但我认为这不是一个好的解决方案: for (int i = 0; i < 4; i++) { sem_post(&sem); } for(int i=0;i

我通过
pthread\u create
创建了4个线程。我希望它们同时开始运行,因此我在线程过程的最开始添加
sem\u wait(&sem)
。在主线程中,我可能会使用类似的方法,但我认为这不是一个好的解决方案:

for (int i = 0; i < 4; i++)
{
    sem_post(&sem);
}
for(int i=0;i<4;i++)
{
sem_post(和sem);
}
我在谷歌上搜索并找到了
pthread\u cond\t
。但是,
pthread\u cond\u broadcast
只能唤醒当前正在等待的线程。即使我将
pthread\u cond\u wait
放在过程的最开始,仍然不能保证
pthread\u cond\u wait
pthread\u cond\u广播之前被调用(在主线程中)

为了避免这种情况,我必须添加大量额外的代码,以确保
wait
broadcast
的调用顺序,这也是不明智的

那么,有没有一种简单的方法来“排列”所有线程(使它们同时开始运行)


似乎有一个
sem\u post\u multiple
,但它是pthread中的win32扩展。但是,我正在使用Linux(Android)。

您正在搜索障碍

pthread\u barrier\t

使用线程数(n)初始化它,然后对每个线程调用pthread\u barrier\u 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;
}
int num_threads=4;
pthread_barrier_t bar;
void*线程开始(void*arg){
pthread_barrier_wait(&bar);
//...
}
int main(){
pthread_barrier_init(&bar,NULL,num_threads);
pthread_t thread[num_threads];
对于(inti=0;i
谢谢。这正是我想要的。Android NDK不支持pthread\u barrier\t,但可以根据这个简化版本来实现它:大多数同步结构可以使用其他工具构建,基本上您只需要互斥和cond.-变量