等待所有线程完成一个工作然后再做另一个工作

时间:2017-05-09 13:17:21

标签: c++ c multithreading pthreads

假设有NUM_TREADS个帖子,他们必须在job1()之前完成job2()。如何保证这种情况发生,如下:

void thread_func(void *arg)
{
    while(1) {
        job1();
        some_kind_of_waiting();
        job2();
    }
    return NULL;
}

信号量会跟随工作还是有其他/更好的解决方案?

{
    static int done;
    static sem_t semaphore;

    if(__sync_fetch_and_add(&done, 1) == THREAD_NUMS-1) {
        done = 0;
        for(i = 0; i < THREAD_NUMS-1; i++)
            sem_post(&semaphore);
    } else
        sem_wait(&semaphore);
}

感谢。

2 个答案:

答案 0 :(得分:3)

这恰好是阻碍障碍的问题。使用NUM_THREADS初始化屏障(在主函数中,在生成线程之前):

pthread_barrier_t barrier;

pthread_barrier_init(&barrier, NULL, NUM_THREADS);

并使用pthread_barrier_wait()进行同步:

void *thread_func(void *arg)
{
    while(1) {
        job1();
        pthread_barrier_wait(&barrier);
        job2();
    }
    return NULL;
}

如果您还需要线程等待所有其他线程再次强制job2(),然后才能再次job1()启动,则可以在屏障上添加第二个等待:

void *thread_func(void *arg)
{
    while(1) {
        job1();
        pthread_barrier_wait(&barrier);
        job2();
        pthread_barrier_wait(&barrier);
    }
    return NULL;
}

答案 1 :(得分:1)

您描述了一个通常由名称barrier调用的高级并发控制结构。 C ++标准库虽然已经proposed,但没有实现屏障,并且有望成为未来C ++标准库的一部分。

在标准库提供解决方案之前,您当然可以自己实现屏障(可以使用条件变量),使用platform specific threading APIwrapper library