2016-05-04 3 views
-1

Ich möchte einen Absatz lesen, indem Sie mit Multithreading ein Wort nach dem anderen extrahieren. Jeder Thread sollte genau ein Wort lesen und wenn der Absatz endet, sollten sie friedlich beendet werden. Ich weiß, dass Threads auf diese Weise nicht verwendet werden sollten, da dies keinen Vorteil bietet. Aber ich möchte das tun, damit ich prüfen kann, wie Threads bei Bedarf sequentiell arbeiten können. Ich habe versucht, aber es sieht so aus, als ob das Programm den Deadlock-Zustand erreicht und überhaupt keine Ausgabe mehr gibt. Es gibt 11 Wörter in der Zeichenfolge und ich verwende 4 Threads.M Wörter aus einem Absatz aus dem n-Thread lesen? C++ Multithreading? Funktioniert nicht?

#include <iostream> 
#include <mutex> 
#include <sstream> 
#include <thread> 
#include <chrono> 
#include <condition_variable> 
using namespace std; 
stringstream s("Japan US Canada UK France Germany China Russia Korea India Nepal"); 
int count = 0; 
string word; 
condition_variable cv; 
mutex m; 
int i = 0; 
bool check_func(int i,int k) 
{ 
    return i == k; 
} 
void print(int k) 
{ 
    while(count < 11) // As there are 11 words 
    { 
    unique_lock<mutex> lk(m); 
    int z = k; 
    cv.wait(lk,[&]{return check_func(i,z);});   // Line 33 
    s >> word; 
    cout<<word<<" "; 
    i++; 
    cv.notify_all(); 
    count++; 
    } 
    return; 
} 
int main() 
{ 
    thread threads[4]; 
    for(int i = 0; i < 4; i++) 
     threads[i] = thread(print,i); 
    for(auto &t : threads) 
     t.join(); 
    return 0; 
} 

Antwort

0

Sie müssen diesen Code ändern:

while(count < 11) // As there are 11 words 
{ 
    unique_lock<mutex> lk(m); 
    int z = k; 
    cv.wait(lk,[&]{return check_func(i,z);});   // Line 33 
    s >> word; 
    cout<<word<<" "; 
    i++; 
    cv.notify_all(); 
    count++; 
} 

Um dies:

int z = k; 
while(z < 11) // As there are 11 words 
{ 
    unique_lock<mutex> lk(m); 
    int z = k; 
    cv.wait(lk,[&]{return check_func(i,z);});   // Line 33 
    s >> word; 
    cout<<word<<" "; 
    i++; 
    z+=4; 
    cv.notify_all(); 
    count++; 
} 

Drei Dinge in der oben geändert: die Erklärung von z außerhalb der Schleife bewegt, die Zustand in der while geändert, um z anstelle von count zu überprüfen, und die Zeile z+=4 hinzugefügt. Sie müssen jedes Mal z um 4 erhöhen, wenn Sie möchten, dass sich jeder Ihrer Threads auf das nächste Wort bewegt. Außerdem müssen Sie überprüfen, dass z nicht zählt, da sonst einige der Threads überschwingen und das letzte Wort mehrmals gedruckt wird (beachten Sie den Thread, der das neunte Wort liest): Wenn Sie z statt z prüfen, geht es weiter zur nächsten Iteration der Schleife, obwohl es nichts weiter zu lesen gibt).

+0

Nun, vielleicht habe ich den Code nicht richtig erklärt. Aber die Implementierung Ihres Vorschlags, der kommentiert und warte, wird dazu führen, dass alle Wörter des ersten Threads gelesen werden, während der Rest drei das letzte Wort immer wieder liest und den String + Nepal 4 Mal druckt, was nur einmal sein sollte. Das Ziel war, dass jeder Thread ein Wort nach dem anderen im Round-Robin-Verfahren lesen sollte, und sobald der String vollständig gelesen wurde, ging er friedlich aus. Als zweites wird die globale Variable i geändert. Sieh einfach nach s >> word; Du wirst i ++ sehen; Vermutlich vermisst du das. Trotzdem danke ! – user3798283

+0

Ja du hast Recht, ich habe das vermisst. Aber bedenken Sie das: Ihr 'cv.wait (...)' wartet auf eine Bedingung, die nur für eine Iteration der 'while' Schleife für jeden Thread wahr sein kann (weil sich z nie ändert, aber ich tue). Daher könnte keiner Ihrer Threads die Schleife möglicherweise mehr als einmal vervollständigen. Wie auch immer, ich werde meine Antwort bearbeiten. – Smeeheey

+0

Nun z + = 4 funktioniert auch nicht und das Programm wird gehängt Grund wird jeder Thread definitiv wird jeder Thread z mit seiner Parameter vale initialisieren, aber jeder Thread wird es auch mit 4 erhöhen, die das Prädikat werden fällt in der zweiten Ausführung der Schleife. Die geeignete Korrektur ist, wenn (i == 4) i = 0; das wird das gewünschte ergebnis möglich machen und ja noch ein s >> wort zu wenn (s >> wort) hoffe du kennst den grund warum. Und ja alle Zustandsvariablen warten Funktion und notify sind ein Muss, ohne dass das Programm in keiner Weise funktioniert. – user3798283

Verwandte Themen