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