2012-11-21 6 views
4

나는 C에서 스레드를 구현하는 예를 다음입니다. 이 예제에서는 1 차원 배열을 사용하고 있습니다. 동적 인 2 차원 배열이 필요합니다.2 차원 배열 포인터

main()int array[ARRAYSIZE] 대신 int **array이 표시되면 어떻게됩니까?

내 문제 구조체에 2 차원 배열에 대한 포인터를 전달하는 방법이다. 아이디어는, 내가 큰 배열을 가지고, 각 스레드는 그 배열의 특정 영역을 채워야 만한다는 것입니다.

고맙습니다. 지금 당신이해야, 여기

int** array = malloc(sizeof(int*)*ARRAYSIZE); 

당신이 int로 포인터의 배열을 할당 :

struct ThreadData { 

    int start, stop; 
    int* array; 

}; 


void* squarer(struct ThreadData* td) { 


    struct ThreadData* data=(struct ThreadData*) td; 
    int start=data->start; 
    int stop=data->stop; 
    int* array=data->array; 
    int i; 

    for (i=start; i<stop; i++) { 
     array[i]=i*i; 
    } 

    return NULL; 
} 

int main(void) { 

    int array[ARRAYSIZE]; 
    pthread_t thread[NUMTHREADS]; 
    struct ThreadData data[NUMTHREADS]; 
    int i; 

    int tasksPerThread=(ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS; 

    for (i=0; i<NUMTHREADS; i++) { 
     data[i].start=i*tasksPerThread; 
     data[i].stop=(i+1)*tasksPerThread; 
     data[i].array=array; 
    } 
    /* the last thread must not go past the end of the array */ 
    data[NUMTHREADS-1].stop=ARRAYSIZE; 

    /* Launch Threads */ 
    for (i=0; i<NUMTHREADS; i++) { 
     pthread_create(&thread[i], NULL, squarer, &data[i]); 
    } 

    /* Wait for Threads to Finish */ 
    for (i=0; i<NUMTHREADS; i++) { 
     pthread_join(thread[i], NULL); 
    } 

    /* Display Result */ 
    for (i=0; i<ARRAYSIZE; i++) { 
     printf("%d ", array[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

답변

1

생각해 그리고 1-D 벡터는 정수로 표현할 수 있습니다. 원래 코드에서 사용하는 정수입니다.)

2 차원 배열에서 startstop은 2 차원 벡터이어야합니다.

struct ThreadData 
{ 
    int start[2], stop[2]; 
    int **array; 
} 

그런 다음 스레드간에 사각형 블록을 분할했습니다. 그리고 각 스레드는 start에서의 블록의 왼쪽 상단 모서리의 위치 및 stop에서의 블록의 오른쪽 아래 모서리의 위치를 ​​가져옵니다.

enter image description here

블록, 인 직사각형, 긴 스트립 (스레드 당 1 열), 또는 장기 (쓰레드 당 하나의 행) 또는 사각형, 또는 그 중간에있을 수 있음을 기억하라. 벤치마킹을 통해 어느 모양이 더 빨리 작동하는지 결정해야합니다. 어떤 의미에서

tasksPerThread은 두 개의 차원을 갖는다. 실제 작업 수는 tasksPerThread[0] * tasksPerThread[1]이됩니다. 그렇게

+0

고마워요! 말이된다 ! – user1841373

4

동적 같은 것을 사용하는 2 차원 할당 배열 : 여기

은 예제 코드입니다 각 포인터에 대해 메모리를 할당하십시오 :

for(int i = 0;i<ARRAYSIZE;i++) 
    array[i] = malloc(sizeof(int)*INNER_ARRAYSIZE); 

이제 모든 항목을 ctual 데이터 :

for(int i = 0;i<ARRAYSIZE;i++) 
    for(int j = 0;j<INNER_ARRAYSIZE;j++) 
     array[i][j]=(i+j);//just for example 

그리고 당신의 ThreadData 구조체는 2 차원 배열 사용 업데이트 :

struct ThreadData { 

int start, stop; 
int** twoDimArray;//note one more * here 

을}; 여기

그냥 통과 포인터 :

일차원 배열 작업 startstop (1-D 공간에서의 좌표를 나타내는 하나의 차원 벡터이다 :이 방법의

struct ThreadData data; 
data.twoDimArray = array; 
data.twoDimArray[0][0] = data.twoDimArray[0][0]*data.twoDimArray[0][0]; //access element at 0,0 and square it 
+0

따라서 당신에게 가난한 캐시 성능을 제공, 모든 데이터를 비 연속을합니다.더 나은 Iliffe 벡터 전략을 사용하십시오. –

+0

주제 초보자가 간단한 자습서를 따라 가려하지만 이제는 모든 무서운 C 것들을 버리자. –

+0

고맙습니다. 작동합니다! – user1841373