2016-11-06 5 views
0

배열의 합계 요소에 대한 다중 스레드 접근 방식을 구현하려고합니다. 내 문제는 아주 기본적인 것입니다. 두 배열의 요소를 합하여 결과를 세 번째 배열, 즉 sumArray [x] = array1 [x] + array2 [x]에 넣고 싶습니다. pthread를 사용해야하는데 OpenMP 나 이와 유사한 암시 적 멀티 쓰레딩 라이브러리를 사용할 수 없습니다. 구현을 생각해 냈지만 배열 요소를 더하지는 않습니다 (2 배열의 합계를 포함하지 않는 결과 배열을 인쇄하여 테스트했습니다). 누구든지 내 구현에서 잘못 된 부분을 지적하는 데 도움이 될 수 있다면 정말 감사 할 것입니다! 참고로, 나는 또한 스레드 수를 명령 줄 인수로 취하기로되어 있습니다.C에서 배열 요소를 합하는 다중 스레드 (pthreads)

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 
#define SIZE 362880 
#define NUM_THREADS 5 
typedef struct coord { 
    int nbThreads; 
    int array1[SIZE]; 
    int array2[SIZE]; 
    int array3[SIZE]; 
} Item; 

void * sumArrays(void *index) { 
    int i, s, itemsToHandle, start, stop; 

    itemsToHandle = SIZE/((Item *) index)->nbThreads; 

    s = * (int *) index; 

    start = s * itemsToHandle; 

    if(s != (((Item *) index)->nbThreads - 1)) start = start + itemsToHandle; 
    else stop = ((Item *) index)->nbThreads; 


    for(i = start + 1; i < stop; i++) { 
     ((Item *) index)->array3[i] = ((Item *) index)->array1[i] + ((Item *) index)->array2[i]; 
    } 
    return(NULL); 
} 
int main(int argc, char* argv[]) { 
    int threads = atoi(argv[1]); 
    Item * arrays = (Item *)malloc(sizeof(Item)); 
    arrays->nbThreads = threads; 
    for(int i = 0; i < SIZE; i++) { 
     arrays->array1[i] = 1; 
     arrays->array2[i] = 1; 
    } 


    pthread_t ids[threads]; 
    int i; 
    for(i = 0; i < threads; i++) { 
     pthread_create(&ids[i], NULL,sumArrays,&arrays); 
     void *status; 
     pthread_join(ids[i], &status); 
    } 
    // I also tried to do another for loop for pthread join 

    for(int i = 0; i < 10; i++) { 
     printf("Array1 = %d\n", arrays->array1[i]); 
     printf("Array2 = %d\n", arrays->array2[i]); 
     printf("Array3 = %d\n", arrays->array3[i]); 
    } 
} 

답변

0

void * sumArrays(void *index) 기능을 아래에서 확인하실 수 있습니까?

s = * (int *) index; 

값은 모든 스레드에서 동일합니다.

스레드가

pthread_create(&ids[i], NULL,sumArrays,&arrays); 

& 연산자를 적용 할 필요가 없습니다 생성 될 때 : arrays 이미 포인터입니다. startstop의 값 이후

pthread_create(&ids[i], NULL,sumArrays, arrays); 

의도 한대로 알고리즘이 작동하지 않습니다 모든 스레드에 대해 동일합니다. 올바르게 이해한다면 스레드간에 작업을 공유 (추가)하고 싶습니다. 첫 번째 스레드는 인덱스 0에서 추가를 시작해야했습니다. 그럴 수없는 것 같습니다 : for(i = start + 1; i < stop; i++) { 위의 의견이 도움이되기를 바랍니다.

이 링크도 확인하십시오 : Using pthreads to process sections of an array/vector.

+0

글쎄, s = * (int *) 인덱스 문에서 스레드 ID를 얻으려고했는데, 그것이 어떻게 끝났는가? 모든 스레드간에 작업을 배포하려는 경우 어떻게 시작하고 끝낼 것입니까? – RedaBitar

+0

아니요! 그건 당신에게 스레드 ID를주지 않습니다. 나는 당신이 필요하다고 생각하지 않지만 리눅스 시스템에서는'getid()'를 사용하여 스레드 ID를 얻을 수있다 : '#include ' 'pid_t tid = gettid();' – sg7

+0

이 링크는 유용 할 것이다. http : //stackoverflow.com/questions/22694042/using-pthreads-to-process-sections-of-an-array-vector?rq=1 – sg7