2016-04-08 142 views
0

我在C.ÇPthread的:通過擺好一個線程殺死其他線程

問題的背景上的並行線程問題工作:有5個線程使用相同的功能,並且當在所述共享核心數據內存命中上限,所有這五個線程應該終止。我使用信號量來確保其中只有一個執行核心數據,這意味着只有五個中的一個會得到結束信號,然後它會告訴其餘的結束。我寫了實現的代碼是:

#define THREAD_NUM 5; 
int thread[THREAD_NUM]; 
sem_t s;  /*semaphore to synchronize*/ 
sem_t empty; /*keep check of the number of empty buffers*/ 
sem_t full; /*keep check of the number of full buffers*/ 


void com_thread(*prt){ // I pass the id of the thread using prt 
    while(1){ 
     sem_wait(&full) 
     sem_wait(&s) 
     ...do something 
     sem_post(&s) 
     sem_post(&empty) 
    } 
} 

while循環運行時,信號會來,我試圖在以下位置接受信號,然後終止所有的線程。

說實話,我需要做的就是優雅地結束所有線程,我需要它們返回到thread_join()的主線程並釋放內存,而不是簡單地退出程序。所以這就是爲什麼我沒有在這裏使用exit()。

下面的主要想法是當其中一個獲得信號時終止其他4個線程。之後它會自行終止。

但是,它不工作,因爲我預期。

#define THREAD_NUM 5; 
int thread[THREAD_NUM]; 
sem_t s;  /*semaphore to synchronize*/ 
sem_t empty; /*keep check of the number of empty buffers*/ 
sem_t full; /*keep check of the number of full buffers*/ 


void com_thread(*prt){ // I pass the id of the thread using prt 
    while(1){ 
     sem_wait(&full) 
     sem_wait(&s) 

     if(signal){ 
      int i; 
      int id = *((int*) prt); 
      for (i=0;i<THREAD_NUM;i++){ 
       if(i != id) 
       pthread_exit(&thread[i]); 
      } 
      pthread_exit(&thread[id]); 
     } 

     ...do something 
     sem_post(&s) 
     sem_post(&empty) 
    } 
} 

任何人都可以幫助我嗎?或者,如果有更好的方法來實現這一目標?在此先感謝:)

回答

0

最簡單的解決方案可能只有一個全局布爾變量,最初初始化爲「false」。所有的線程檢查這個變量是「假」還是「真」,如果它是「真」,它們終止。

當一個線程注意到所有的線程都應該被終止時,它只是簡單地將這個標誌設置爲「true」,而其他線程遲早會注意到。

您可以在線程函數的多個位置檢查此退出條件,特別是當某個線程正在等待當前活動線程(設置退出條件的線程)的鎖時。