2017-05-09 59 views
0

假设有NUM_TREADS线程,并且他们必须在完成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); 
} 

谢谢。

+2

这是一个C或C + +的问题?答案取决于你使用的语言。 –

+3

您正在从'void'函数返回NULL。 –

+0

你可以使用C++ std :: future吗? – Alek86

回答

3

这正是pthreads障碍打算解决的问题。初始化屏障,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; 
} 

如果您还需要线程等待,直到所有其他线程已经compelted job2()之前,任何人都可以在job1()重新开始,你可以在阻挡添加第二个等待:

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

你将如何重新初始化后续循环的障碍?你需要第二道屏障,还是可以使用第一道屏障重新初始化,以使线程在job2()完成后和恢复job1()之前等待? –

+0

@JonathanLeffler:障碍不需要重新初始化。线程刚刚从屏障释放后,屏障就可以等待线程再次等待。 – caf

+0

感谢您的信息。 –

相关问题