2017-07-04 2 views
0

Könnten Sie bitte jemand helfen mir, die Probleme im folgenden Code zu identifizieren.Hinzufügen von zwei Arrays funktioniert nicht mit Pthread

Hintergrund: Der Testcode fügt zwei Arrays hinzu, input1 & input2 und speichert die Ergebnisse in der Ausgabe mit 4-Threads. Das Problem war einer der Thread nicht in der Lage, richtig zu tun, Ausgabe-Puffer zeigt "0" zufällig für einen der Threads. Jede Hilfe wird sehr geschätzt.

#include<iostream> 
#include<pthread.h> 
#include<unistd.h> 
using namespace std; 
int input1[1000], input2[1000], output[1000]; 

void* Addition(void* offset) { 
    int *local_offset = (int*)offset; 
    for(int i = ((*local_offset) * 250); i < ((*local_offset)+1)*250; ++i) { 
      output[i] = input1[i] + input2[i]; 
    } 
    pthread_exit(0); 
} 

int main() { 
    pthread_t thread_id[4]; 
    void* status; 
    fill_n(input1, 1000, 3); // input1, fill the buffer with 3 
    fill_n(input2, 1000, 4); // input2, fill the buffer with 4 
    fill_n(output, 1000, 0); // output, fill the buffer with 0 

    // create 4 thread with load of 250items 
    for(int i = 0; i < 4; ++i) { 
      int result = pthread_create(&thread_id[i], NULL, Addition, &i); 
      if(result) cout << "Thread creation failed" << endl; 
    } 

    // join the 4-threads 
    for(int i = 0; i < 4; ++i) { 
      int result = pthread_join(thread_id[i], &status); 
      if(result) cout << "Join failed " << i << endl; 
    } 

    // print output buffer, the output buffer not updated properly, 
    // noticed"0" for 1 & 2 thread randomly 
    for(int i =0; i < 1000; ++i) 
      cout << i << " " << output[i] << endl; 

    pthread_exit(NULL); 
} 

Antwort

1

ich die Ursache des Problems gefunden habe ... Das „& i“ gibt unbekanntes Ergebnis, weil „i“ Speicher durch überschrieben wird ++ i und thread_id [0] durch die anderen Wert bekommen Zeit der Thread erstellt ... so sollten Sie einen dedizierten Speicher haben, so dass kein Überschreiben von ++ i;

& i ist das Problem ...

int result = pthread_create(&thread_id[i], NULL, Addition, &i); 

zu lösen, ersetzen mit & shared_data [i] .... int result = pthread_create(&thread_id[i], NULL, Addition, &shared_data[i]);

Die shared_data ist ein Array von 4 Elementen .. wie diese

int shared_data[4] = {0,1,2,3};