C++ 等待所有线程完成一个作业,然后再执行另一个作业

C++ 等待所有线程完成一个作业,然后再执行另一个作业,c++,c,multithreading,pthreads,C++,C,Multithreading,Pthreads,假设有NUM\u线程并且它们必须在执行job2()之前完成job1()。如何保证这种情况发生,比如: void thread_func(void *arg) { while(1) { job1(); some_kind_of_waiting(); job2(); } return NULL; } 信号灯会喜欢下面的工作吗,或者有其他/更好的解决方案吗 { static int done; static se

假设有
NUM\u线程
并且它们必须在执行
job2()
之前完成
job1()
。如何保证这种情况发生,比如:

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);
}
{
静态int完成;
静态扫描信号量;
if(uuu sync_fetch_u和_add(&done,1)=线程\u NUMS-1){
完成=0;
对于(i=0;i

谢谢。

这正是pthreads屏障想要解决的问题。使用
NUM_THREADS
初始化屏障(在生成线程之前,在主函数中):

并使用
pthread\u barrier\u 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;
}

这正是pthreads屏障想要解决的问题。使用
NUM_THREADS
初始化屏障(在生成线程之前,在主函数中):

并使用
pthread\u barrier\u 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;
}

您描述了一个高级并发控制结构,通常以名称命名。C++标准库虽然没有实现,但它将来可能是C++的标准库,希望将来成为C++标准库的一部分。
在标准库提供解决方案之前,您当然可以自己实现屏障(您可以使用条件变量)、使用或。

您描述了一个通常由名称命名的高级并发控制结构。C++标准库虽然没有实现,但它将来可能是C++的标准库,希望将来成为C++标准库的一部分。

直到标准库提供了一个解决方案,你当然可以自己实现屏障(你可以使用条件变量),使用A或A。< /P>这是C还是C++问题?答案取决于你使用的语言。你从代码< > VoUT> /Cuff>函数返回 null >代码>。你能使用C++ STD::将来吗?这是C还是C++问题?答案取决于你使用的语言。你从<代码>空白>代码>函数中返回<代码> null <代码>。你能使用C++ STD::将来吗?你会如何为后续的循环重新初始化屏障?您是否需要第二个屏障,或者是否可以使用重新初始化的第一个屏障,使线程在

job2()
完成后和恢复
job1()
之前等待?@JonathanLeffler:不需要重新初始化屏障。线程从屏障中释放后,该屏障立即可供线程再次等待。感谢您提供的信息。您将如何为后续循环重新初始化屏障?您是否需要第二个屏障,或者是否可以使用重新初始化的第一个屏障,使线程在
job2()
完成后和恢复
job1()
之前等待?@JonathanLeffler:不需要重新初始化屏障。线程从屏障中释放后,该屏障立即可供线程再次等待。感谢您提供的信息。