작업자 스레드와 촉진자 스레드를 올바르게 동기화하는 데 문제가 있습니다. 내가 해결하려고하는 문제는 최대 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;
입니다 내가 어떻게 해결할 수 있을지 생각해. 문제가 있거나 세마포어를 사용하는 쉬운 방법이 있다면 도움에 감사 할 것입니다.
감사
미구엘에게 감사드립니다. facilitator의 목적은 다른 스레드가 발견 할 수있는 소수보다 작은 숫자를 스레드가 건너 뛸 수있게하기 위해서입니다. 그것은 일을 더 효율적으로 만들어야하지만, 제 구현에서는 어떻게 생각하는지 모르겠습니다. 파일 할당에 관해서는, 스레드가 실행 중일 때만,이 점을 더 효율적으로 만들려고하지는 않습니다. 즉, 파일을 할당 한 후 작업자의 시간을 측정하기 시작합니다. –
안녕하세요. Trevor. 나는 여전히 촉진자 과제에 대한 필요성을 보지 못합니다. 솔루션은 잠금이나 조건을 기다리는 데 많은 시간을 할애해야하며, 중요하지 않은 경우에도보고있는 모든 숫자에 대해이를 수행해야합니다. 경합이 많이 발생하는 10 개의 스레드가 있습니다. 당신은 정말로 프로세스를보다 효율적으로 만들고있는 것은 아닙니다. 내 솔루션에서 스레드가 자체 최대 함께 작동하고 하나만 발견되면 잠글 것입니다. 그리고 그 시점에서 자물쇠가 잡히기 때문에 그것은 당신의 솔루션에서와 같이 세계 최대를 잡을 것입니다. – Miguel
+1에 # 2. 조당의 요점을 정말로 보지 못합니다, 트레버 당신은 쉽게 새로운 소수를 게시하고 거기에 더 높은 가치를 발견 할 때 각 근로자가 앞으로 건너 뛰게 쉽게 할 수 있습니다. 그 문제에 대해 먼저 파일을 정렬하고 작업을 수행 할 수 있습니다. 가장 큰 소수가 발견되면 해당 파일을 완료합니다. – Duck