방법

2011-11-24 8 views
2

의사 코드를 종료 스레드 장벽을 처리하기 : 장벽방법

void * thread_start(void *arg) { 
    while (1) { 
     /* for each column. Only run columns the thread_num 
      is assigned to */ 
     column_count = thread_num; 
     for (; column_count < dim - 1; column_count+=threads) { 
      /* do thread work for data chunk */ 
     } 

     /* barrier */ 
     barrier_result = pthread_barrier_wait(barrier); 

     if (not_finished == 0) { 
      /* finished */ 
      break; 
      /* break while loop, end thread. 
       The barrier is now broken because it is no longer 
       getting called by this thread */ 
     } 

     /* we are not finished, loop around and 
      do thread work on next data chunk */ 
    } 
} 

내 문제는 당신이 다른 스레드 전에 종료 스레드를 처리 어떻게?

장벽이란 모든 스레드가 다른 모든 스레드를 기다려야한다는 것을 의미합니다.

모든 스레드가 동시에 종료되도록하기위한 기술은 무엇입니까?

나는 루프를 연속하는 그러나 "스레드 작업을"무시했지만,이 경우에는 모두 8 개 개의 스레드를 완료하고 "당신의 모든 일을 수행 할 수 있습니다 이제 모든 출구"

를 스레드를 알 수있는 합리적인 방법이 없습니다 편집 :

알고리즘 :

  • 데이터 조각의 세그먼트에

    1. 실행 작업 데이터의 조각 스레드의 세그먼트가 완료되면 termina 테.
    2. 차단 대기.

      하나 인 장벽과 장벽을 덮어 쓸 수있는 우아한 방법이 있나요 :

    3. 하나 개의 스레드는 새로운 데이터
    4. 반복 1.

    편집 2 데이터의 조각을 대체 크기가 더 작습니까? (장벽 주위에 뮤텍스를 두지 않음)

  • +1

    우아하지 않은 방법도 있습니다. 같은 장벽에서 다른 장벽을 덮어 쓰거나'pthread_barrier_init'을 두 번 이상 호출 할 수 없습니다. – chill

    답변

    0

    프로그램 로직의 특성상 스레드가 동시에 종료되도록 보장합니다. 알고리즘이 thread를 다른 시각에 종료하도록 (듯이) 요구하면 (자), 장벽은 그 알고리즘의 적절한 concurrent processing 제어기구가 아닙니다.

    편집 :

    당신은 원자에 "finished_count"루프를 증가 수있는 일을하지, 다른 하나는 그 숫자가 장벽 수보다 작을 때 다음 장벽을 참여 (보호 읽기/finished_count에 기록 적절한 뮤텍스와 함께).

    편집 : 나는 당신의 추가 설명을 이해한다면, 난 그냥 어쩌면 당신을 위해 일 것이다, 원래의 코드를 기반으로 쓴 잘 모르겠어요 :

    int finished_count; 
    
    void * thread_start(void *arg) { 
        int finished = 0; 
    
        while (1) { 
    
         if (finished) { 
          pthread_mutex_lock (&finished_lock); 
          if (finished_count == 8) { 
           pthread_mutex_unlock (&finished_lock); 
           break; 
          } 
          pthread_mutex_unlock (&finished_lock); 
         } else { 
          /* for each column. Only run columns the thread_num 
           is assigned to */ 
          column_count = thread_num; 
          for (; column_count < dim - 1; column_count+=threads) { 
           /* do thread work for data chunk */ 
          } 
    
          /* set "finished" as appropriate */ 
    
          /* Check if we have just finished. */ 
          if (finished) { 
           pthread_mutex_lock (&finished_lock); 
           ++finished_count; 
           pthread_mutex_unlock (&finished_lock); 
          } 
         } 
    
         barrier_result = pthread_barrier_wait(barrier); 
        } 
    
        return 0; 
    } 
    

    편집 :

    이 끝난 복사하거나 다시 초기화에 대한보다 내 의견을 명확히하기 위해, POSIX는 말한다 :

    http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_barrier_init.html

    이미 초기화 된 장벽을 지정하는 pthread_barrier_init()가 호출되면 결과가 정의되지 않습니다.

    및 전용 배리어에 의해 참조 된 오브젝트는 동기화를 수행하기 위해 사용될 수있다. pthread_barrier_destroy() 또는 pthread_barrier_wait()에 대한 호출에서 해당 객체의 복사본을 참조한 결과는 정의되지 않습니다.

    +0

    "algorithm"에 대한 설명으로 질문을 업데이트했습니다. 의견 있으십니까? – Raynos

    +0

    당신은 그 질문을 이해했습니다. 나는 끝난 수를 지켜야 할 것이다. 대안은 새로운 장벽으로 장벽을 덮어 쓰는 것입니다. 나는 어느 것이 더 performant인지 모른다. – Raynos

    +0

    "thread finished"에 대한 카운터를 유지하지 않고 n이 될 때까지 대기합니다. thread는 「thread not finished」플래그를 보관 유지해, n thread 중 어느 것도 「완료하지 않는다」경우는 종료 할 필요가 있습니다. – Raynos