2017-05-09 57 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

感謝您的信息。 –

相關問題