2011-12-10 2 views
0

작업자 스레드와 촉진자 스레드를 올바르게 동기화하는 데 문제가 있습니다. 내가 해결하려고하는 문제는 최대 10 개의 스레드를 사용하는 최대 10 개의 파일을 찾는 것입니다. 1 스레드는 단일 스레드이며 그보다 큰 스레드는 다중 스레드입니다. 문제는 근로자가 촉진자에게 새로운 소수를 발견했다고 신호를 보내는 곳입니다. Facilitator는 숫자가 중요하지 않은 경우이를 무시할 수 있으며, 중요한 경우 모든 스레드 my_latest_lgprime을 업데이트하라는 신호를 보낼 수 있습니다. 나는 두뇌와 코드에 계속 머물러있다.작업자 스레드 및 컨트롤러 스레드 동기화

촉진자와 동기화를 사용하여 작업을 완료해야합니다. 여기

는 내가 지금까지 무엇을 가지고 :

노동자 :

void* worker(void* args){ 
    w_pack* package = (w_pack*) args; 
    int i, num; 
    char text_num[30]; 
    *(package->fac_prime) = 0; 
    for(i = 0; i<package->file_count; i++){ 
      int count = 1000000; //integers per file 
      FILE* f = package->assigned_files[i]; 
      while(count != 0){ 
       fscanf(f, "%s", text_num); 
       num = atoi(text_num); 
       pthread_mutex_lock(&lock2); 
       while(update_ready != 0){ 
        pthread_cond_wait(&waiter, &lock2); 
        package->my_latest_lgprime = largest_prime;//largest_prime is global 
        update_ready = 0; 
       } 
       pthread_mutex_unlock(&lock2); 
       if(num > (package->my_latest_lgprime+100)){ 
        if(isPrime(num)==1){ 
         *(package->fac_prime) = num; 
         package->my_latest_lgprime = num; 
         pthread_mutex_lock(&lock); 
         update_check = 1; 
         pthread_mutex_unlock(&lock); 
         pthread_cond_signal(&updater); 
        } 

       } 
       count--; 
      } 
    } 

    done++; 
    return (void*)package; 
}` 

진행자 : 사람이 어떤이있는 경우 여기에

void* facilitator(void* args){ 
    int i, temp_large; 
    f_pack* package = (f_pack*) args; 

    while(done != package->threads){ 
      pthread_mutex_lock(&lock); 
      while(update_check == 0) 
       pthread_cond_wait(&updater, &lock); 
      temp_large = isLargest(package->threads_largest, package->threads); 
      if(temp_large > largest_prime){ 
       pthread_mutex_lock(&lock2); 
       update_ready = 1; 
       largest_prime = temp_large; 
       pthread_mutex_unlock(&lock2); 
       pthread_cond_broadcast(&waiter); 
       printf("New large prime: %d\n", largest_prime); 
      } 
      update_check = 0; 
      pthread_mutex_unlock(&lock); 
    } 
} 

가 근로자 패키지

typedef struct worker_package{ 
    int my_latest_lgprime; 
    int file_count; 
    int* fac_prime; 
    FILE* assigned_files[5]; 
} w_pack; 

입니다 내가 어떻게 해결할 수 있을지 생각해. 문제가 있거나 세마포어를 사용하는 쉬운 방법이 있다면 도움에 감사 할 것입니다.

감사

답변

1

정말 확신에 문제를 발견 할 수는 없지만 간략는 done 변수가 스레드간에 공유 아직 동기화없이 액세스하고 수정 보인다 코드를 읽어.

어쨌든 솔루션 개선을위한 몇 가지 아이디어를 제안 할 수 있습니다.

  1. 시작시 각 스레드에 파일 목록을 할당합니다. 이것은 각 파일을 처리하는 데 다소 시간이 걸릴 수 있기 때문에 가장 효율적인 방법은 아닙니다. 하나의 파일 목록을 갖는 것이 더 나은 접근 방법 인 것처럼 보이고 각 스레드는 목록의 다음 파일을 선택합니다.

  2. 정말이 문제에 대한 촉진자 작업이 필요합니까? 그것은 나에게 각 스레드가 자신의 가장 큰 소수를 추적 할 수 있고, 새로운 최대 값을 찾을 때마다 전역 최대 값을 점검하고 필요할 경우이를 업데이트 할 수 있습니다. 단일 최대 값 (스레드 당 최대 값 제외)을 유지할 수도 있지만 비교해야 할 때마다 잠금을 요구합니다. 당신은 당신이 max_global_number = 0를 초기화해야 작업자 스레드를 시작하기 전에

    while (true) { 
        lock(file_list_mutex) 
        if file list is empty { 
         break // we are done! 
        } 
        file = get_next_file_in_list 
        unlock(file_list_mutex) 
    
        max = 0 
        foreach number in file { 
         if number is prime and number > max { 
          lock(max_number_mutex) 
          if (number > max_global_number) { 
           max_global_number = number 
          } 
          max = max_global_number 
          unlock(max_number_mutex) 
         } 
        } 
    } 
    

    : 여기

내가 작업자 스레드을 작성하는 방법의 의사 코드이다.

위의 솔루션은 사용자의 경우처럼 잠금을 남용하지 않기 때문에 스레드 경합이 최소화됩니다.

+0

미구엘에게 감사드립니다. facilitator의 목적은 다른 스레드가 발견 할 수있는 소수보다 작은 숫자를 스레드가 건너 뛸 수있게하기 위해서입니다. 그것은 일을 더 효율적으로 만들어야하지만, 제 구현에서는 어떻게 생각하는지 모르겠습니다. 파일 할당에 관해서는, 스레드가 실행 중일 때만,이 점을 더 효율적으로 만들려고하지는 않습니다. 즉, 파일을 할당 한 후 작업자의 시간을 측정하기 시작합니다. –

+0

안녕하세요. Trevor. 나는 여전히 촉진자 과제에 대한 필요성을 보지 못합니다. 솔루션은 잠금이나 조건을 기다리는 데 많은 시간을 할애해야하며, 중요하지 않은 경우에도보고있는 모든 숫자에 대해이를 수행해야합니다. 경합이 많이 발생하는 10 개의 스레드가 있습니다. 당신은 정말로 프로세스를보다 효율적으로 만들고있는 것은 아닙니다. 내 솔루션에서 스레드가 자체 최대 함께 작동하고 하나만 발견되면 잠글 것입니다. 그리고 그 시점에서 자물쇠가 잡히기 때문에 그것은 당신의 솔루션에서와 같이 세계 최대를 잡을 것입니다. – Miguel

+0

+1에 # 2. 조당의 요점을 정말로 보지 못합니다, 트레버 당신은 쉽게 새로운 소수를 게시하고 거기에 더 높은 가치를 발견 할 때 각 근로자가 앞으로 건너 뛰게 쉽게 할 수 있습니다. 그 문제에 대해 먼저 파일을 정렬하고 작업을 수행 할 수 있습니다. 가장 큰 소수가 발견되면 해당 파일을 완료합니다. – Duck