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

时间:2016-10-19 08:49:21

标签: c++ multithreading pthreads

我已经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(在主线程中)。

为了避免这种情况,我必须添加许多其他代码,以确保waitbroadcast的调用顺序,这也是不聪明的。

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

似乎有一个sem_post_multiple,但它是pthread中的win32扩展。我使用的是Linux(Android)。

1 个答案:

答案 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;
}