2017-12-30 37 views
0

난 그냥 pthreads을 사용하여 병렬 프로그래밍을 배우기 시작했습니다. 그래서, 학습 목적을 위해 나는 두 개의 정수 배열을 병렬 적으로 시도했습니다. 나는 배열 변수 a, bc을 가지고 struct construct을 선언했다. a, b을 추가하고 결과를 c에 저장하고 싶습니다.pthread를 사용한 병렬 프로그래밍

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 

#define MAX 6 

struct data { 
    int a[MAX]; 
    int b[MAX]; 
    int c[MAX]; 
}; 

void *addition(void *index) { 
    struct data *d1 = (struct data *)index; 
    printf("value of d1 structure=%d\n", d1->a[0]); 
} 

int main() { 
    int i, j, t; 
    struct data *item = NULL; 
    pthread_t threads[MAX]; 

    item = (struct data *)malloc(sizeof *item); 

    printf("enter the value for arrray a\n"); 
    for (i = 0; i < MAX; i++) { 
    scanf("%d", &item->a[i]); 
    } 

    printf("enter the value of array b\n"); 
    for (j = 0; j < MAX; j++) { 
    scanf("%d", &item->b[j]); 
    } 

    for (t = 0; t < MAX; t++) { 
    pthread_create(&threads[t], NULL, addition, (void *)&item); 
    } 
} 

여기, 지금의 나는이 pthread_create()에서 나는 기능뿐만 아니라, structure의 도움으로 세 개의 인수를 전달하고 때 때문에 변수 ab이 함수 addition()의 배열의 추가를 추가하지 않은 복사되지 않습니다. a을 인쇄하면 쓰레기 값이 나옵니다. 아무도 pthread_create()이 호출 한 함수 인수에 structure 변수를 복사하는 방법을 알려줄 수 있습니까?

+2

'item'의 유형은 무엇인가에 대한 호출? '& item'의 타입은 무엇입니까? 당신이 그 때 그것을 알고있을 때 문제는 명백해야한다. –

+1

스레드가 완료 될 때 처리를 동기화하려면'pthread_join()'호출이 필요합니다. 또한 스레드가 작동했음을 입증해야합니다. 6 개의 다른 스레드가 6 가지 계산을 수행하는 방법을 표시하지 않았습니다. 그들은 모두 데이터에 대한 액세스를 제어하지 않고 동일한 계산 (6 개의 추가 및 지정)을 수행합니다. 이것은 잠재적 인 문제의 주요 원인입니다. 작업량이 너무 적어서 스레드가 서로 간섭 할 기회가 없으므로 눈치 채지 못할 수 있습니다. 스레드 함수는 null 포인터 값을 반환해야합니다. 귀하의 컴파일러는 불평해야합니다! –

답변

3

pthread_create 기능 :

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
          void *(*start_routine) (void *), void *arg); 

친절 (*arg)arg에 대한 포인터입니다주의. struct data *item을 포인터로 작성한 다음 해당 주소 즉 포인터를 포인터로 전달합니다.

pthread_create(&threads[t], NULL, addition, (void *)&item); 

변경

pthread_create(&threads[t], NULL, addition, (void *)item). 
+0

pthread_create (& threads [t], NULL, addition, (void *) item.) 문제가 해결되었습니다. – Zainab