2017-04-23 4 views
0

pthread 사용이 필요한 작업을하고 있습니다. 기본적으로 매트릭스에서 최대 값을 찾고 싶지만 모든 작업을 단일 처리하는 대신 pthreads을 사용하여 처리합니다. 아래 정의 된대로 하나의 구조체를 사용하여 findMaxPerArea 함수에 여러 값을 입력합니다. 마지막 줄에 pthread_create(...);을 호출하면 문제가 발생합니다. printf 전에 잘 전달합니다. 제발 너무 바보 같은 실수는 아님을 알아 두십시오. 이견있는 사람? 당신이 포인터에 값을 캐스팅 이후struct pthread_create 호출시 세그먼트 화 오류가 발생했습니다.

pthread_t*- threadArr[i] 주조 는
struct inputData{ 
    int ** array; 
    int start, stop, cols, threadID; 
    int* localmax; 
}; 


void* findMaxPerArea(void* tmp){ 
    struct inputData* inp = (struct inputData*) tmp; 
    inp->localmax[inp->threadID] = 0; 
    int i, j; 
    for(i = inp->start; i < inp->stop; i++){ 
    for(j = 0; j < inp->cols; j++){ 
     if(inp->array[i][j] > inp->localmax[inp->threadID]) inp->localmax[inp->threadID] = inp->array[i][j]; 
    } 
    } 
} 


int main(){ 
    int N, p; 

    printf("Give me the number of threads\n"); 
    scanf("%d", &p); 
    printf("Give me the number of rows and columns (one value)\n"); 
    scanf("%d", &N); 

    int* localmax = malloc(p * sizeof(int)); 
    pthread_t* threadArr = (pthread_t*) malloc(p*sizeof(pthread_t)); 

    int** a = malloc(N * sizeof(int*)); 
    for (int i = 0; i < N; i++) { 
    a[i] = malloc(N * sizeof(int)); 
    } 
    for(int i = 0; i < N; i++){ 
    for(int j = 0; j < N; j++){ 
     a[i][j] = 5; 
    } 
    } 
    a[0][1] = 8; 
    a[1][1] = 13; 
     struct inputData* inputArray = (struct inputData*) malloc(p * sizeof(struct inputData)); 
      for(int i = 0; i < p; i++){ 
      inputArray[i].array = a; 
      inputArray[i].start = i*(N/p); 
      inputArray[i].stop = (N/p)*(i+1) - 1; 
      inputArray[i].cols = N; 
      inputArray[i].threadID = i; 
      inputArray[i].localmax = localmax; 
      printf("It passes this\n"); 
      pthread_create((pthread_t*)threadArr[i], NULL, findMaxPerArea, (void*)&inputArray[i]); 
      }} 
+0

: 대신 (이미 pthread_t의 배열을 처리하고 이후) 완전히 캐스트를 생략하고 i 번째 요소의 주소를 먹고 싶어 코드를 추론하기가 매우 어렵습니다. 질문의 범위를 [최소한의 완전하고 검증 가능한 예] (https://stackoverflow.com/help/mcve)로 작성하십시오. –

+0

내 대답이 업데이트되었습니다.이 코드는 전체 코드입니다. –

+0

캐스트를 사용하지 마십시오. 그것은 간단합니다. (아니, 실제로 그렇게 단순하지는 않지만 때로는 그렇게해야만합니다.) 그러나 첫 번째 근사치로이 규칙이 작동합니다. 단일 캐스트를 작성하지 않고 C와 함께 몇 년 또는 몇 년을 보낼 수 있습니다. 마지막으로 하나를 쓰면 필요합니다. 맞습니다.) –

답변

1
pthread_create((pthread_t*)threadArr[i], NULL, findMaxPerArea, (void*)&inputArray[i]); 

, 이해되지 않는다. 그것이, 당신이 우리를 보이고있다 스 니펫을 현재 ​​코드와

&threadArr[i] 
+2

@GusAndrianos 여러분, 환영합니다. 그러나 StackOverflow에서 맹세코 단어를 사용하지 마십시오. 잘 받아들이지 않았으며 질문과 답변이 삭제 될 수도 있습니다. –

+0

미안하지만, 거의 한 시간 동안 찾고있었습니다. –