2016-11-07 2 views
0

Also ich erstelle 3 Threads. 1, um eine Eingabe von dem Benutzer 1 zu lesen, um einige Zeichenfolgenmanipulation auszuführen, und 1, um in die Eingabeaufforderung zu schreiben.Segmentierung Fehler beim Ausführen von 3 Threads

Ich habe einige cout Anweisungen eingerichtet, um zu sehen, wo ich einen Fehler erhalte. Ich kann sehen, dass ich den Fehler bekomme, nachdem ich die Threads erstellt habe.

Ich denke, es muss etwas sein, mit dem Thread zuerst ausgeführt wird. Ich möchte die readerThread Funktion zuerst ausführen, dann die converterThread und schließlich die writerThread. Ich habe mich nach einer Möglichkeit umgesehen, um mehr Logik zu implementieren, um die Reihenfolge zu beschränken, in der die Threads ausgeführt werden und keine finden können.

Sowieso hier ist mein Code:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
int counter = 0; 
vector<string> readBuffer; 
vector<string> writeBuffer; 
int main(){ 
    int readerInt,writerInt,converterInt; 
    pthread_t reader,writer,converter; 
    cout << "BEFORE"<<endl; 
    readerInt = pthread_create(&reader, NULL,readerThread,NULL); 
    converterInt = pthread_create(&converter,NULL,converterThread,NULL); 
    writerInt = pthread_create(&writer,NULL,writerThread,NULL); 
    cout << "AFTER" << endl; 

    pthread_join(reader,NULL); 
    pthread_join(converter,NULL); 
    pthread_join(writer,NULL); 

    return 0; 
} 
void * readerThread(void *unused){ 
    while(1){ 
    pthread_mutex_lock(&lock); 
    string readLine; 
    getline(cin,readLine); 
    counter++; 
    readBuffer.push_back(readLine); 
    pthread_mutex_unlock(&lock); 
    } 
} 
void * converterThread(void *unused){ 
    while(1){ 
    pthread_mutex_lock(&lock); 
    if(readBuffer.size() > 0){ 
     replace(readBuffer[counter-1].begin(),readBuffer[counter-1].end(),' ','%'); 
     writeBuffer.push_back(readBuffer[counter-1]); 
    } 
    pthread_mutex_unlock(&lock); 
    } 
} 
void * writerThread(void *unused){ 
    while(1){ 
    pthread_mutex_lock(&lock); 
    cout << writeBuffer[counter-1] << endl; 
    pthread_mutex_unlock(&lock); 
    } 
} 
+0

Klingt wie ein [Leser-Schreiber] (https://en.wikipedia.org/wiki/Readers-Writers_Problem) Problem. Wenden Sie sich an Ihren nächsten Browser und starten Sie Google, die Antwort sollte warten – smac89

Antwort

1

Ihr writerThread Thread startet den Auftrag, bevor die Daten angekommen und Sie Zugriff auf:

cout << writeBuffer[counter-1] << endl; 

wenn counter noch 0 ist. Sie sollten die Größe von writeBuffer vor dem Zugriff überprüfen.

counter Variable ist nicht immer gültig für writeBuffer. Es passiert, wenn Daten in readBuffer sind, aber noch nicht von converterThread verarbeitet werden.

Sie könnten counter Variablenverwendung entfernen und Datenstrukturen für readBuffer und writeBuffer verbessern. Verwenden Sie std::queue, um eine Warteschlange für die Datenkonvertierung zu erstellen. Eine Warteschlange readBuffer zum Lesen von Daten und eine writeBuffer Warteschlange für verarbeitete Ergebnisse. Verwenden Sie Push/Pop-Methoden.

+0

In Ordnung, jetzt bekomme ich den Fehler, es scheint meine "ReaderThread" -Funktion zu loopen. Scheint nicht wie seine Entriegelung. Wenn es dann ist, wird es wieder gesperrt, bevor die anderen Funktionen ausgeführt werden können. – droly96

+0

@ droly96 Wenn der Segmentierungsfehler behoben ist, könnten Sie mit 'sleep (1)' spielen, bevor Mutex Ihre Threads sperrt und debuggt, um zu sehen, was falsch ist. – Nikita

Verwandte Themen