2017-12-30 32 views
0

Ich habe gerade angefangen zu lernen parallele Programmierung mit pthreads. Also, für den Lernzweck habe ich die Summe zweier Integer-Arrays parallel ausprobiert. Ich habe struct construct mit drei Array-Variablen a, b und c deklariert. Ich möchte hinzufügen a, b und speichern Sie das Ergebnis in c.Parallele Programmierung mit 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); 
    } 
} 

Hier, wie jetzt ich habe nicht die Zugabe von Arrays in der Funktion addition(), weil in pthread_create() hinzugefügt, wenn ich die drei Argumente mit Hilfe von structure, in Funktion hinaus bin vorbei die Variablen a und b sind nicht kopiert werden. Drucken a gibt mir Müllwert. Kann jemand mir helfen, wie man die structure Variable zum Funktionsargument kopiert, das durch pthread_create() angerufen wird.

+2

Was ist die Art von 'item'? Was ist der Typ von '& item'? Wenn Sie das wissen, sollte das Problem offensichtlich sein. –

+1

Sie benötigen einige 'pthread_join()' Aufrufe, um die Verarbeitung beim Beenden der Threads zu synchronisieren. Sie müssen auch zeigen, dass die Threads funktioniert haben. Sie haben nicht gezeigt, wie Ihre 6 verschiedenen Threads 6 verschiedene Berechnungen durchführen. Sie machen alle die gleiche Berechnung (6 Additionen und Zuweisungen) ohne Kontrolle über den Zugriff auf die Daten. Dies ist eine Hauptursache für (potentielle) Probleme. Sie werden es möglicherweise nicht bemerken, weil die Arbeitslast so gering ist, dass die Threads nie die Chance bekommen, sich gegenseitig zu stören. Die Thread-Funktion sollte einen Wert zurückgeben - einen Nullzeiger. Dein Compiler sollte sich beschweren! –

Antwort

3

pthread_create Funktion:

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

Bitte beachten Sie (*arg) Zeiger auf die arg ist. Sie haben struct data *item als einen Zeiger erstellt, dann übergeben Sie seine Adresse, d. H. Zeiger auf Zeiger.

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

Ändern Sie den Aufruf von

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

Ändern des Aufrufs zu: pthread_create (& threads [t], NULL, Zusatz, (void *) Element. Gearbeitet. Problem gelöst. Danke – Zainab