Nehmen wir an, es gibt eine Anzahl von Threads, die aus einer Schleife bestehen, die Instanzen derselben Funktion ausführt, aber der Start jeder Iteration muss synchronisiert werden (so müssen die Threads, die zuerst fertig sind, auf die letzte warten, um eine neue Iteration zu beginnen)). Wie kann dies in C++ 11 getan werden?Wie synchronisiert man Instanzen einer Funktion, die auf verschiedenen Threads läuft (in C++ 11)?
...
Der Rest der Post ist genau das, was ich versucht habe, und wie es funktioniert nicht.
Ich verwende einen Zähler, "Sync", zunächst auf 3 (die Anzahl der Threads). Jeder Thread am Ende der Funktion zieht 1 von diesem Zähler ab und beginnt zu warten. Wenn der Zähler 0 erreicht, bedeutet dies, dass die 3 von ihnen eine Runde beendet haben. Der Hauptzweig setzt den Zähler auf 3 zurück und benachrichtigt die Threads, um sie aufzuwecken.
Dies funktioniert die meiste Zeit, aber manchmal ein oder zwei der Threads nicht aufwachen.
So sind diese die globalen Variablen:
mutex syncMutex;
condition_variable syncCV;
int sync;
Dies ist am Ende der Funktion, die in dem Gewinde in einer Schleife läuft:
unique_lock<mutex> lk(syncMutex);
cout << "Thread num: " << mFieldNum << " got sync value: " << sync;
sync --;
syncCV.notify_all();
cout << " and goes to sleep..." << endl;
syncCV.wait(lk, []{return sync == numFields;});
cout << "Thread num: " << mFieldNum << " woke up" << endl;
}
Und das läuft in einer Schleife in der Hauptthread:
unique_lock<mutex> lk(syncMutex);
syncCV.wait(lk, []{return sync == 0;});
sync = 3;
lk.unlock();
cout << "Notifying all threads!" << endl;
syncCV.notify_all();
Dies ist die Ausgabe, die es erzeugt, wenn es fehlschlägt (Thread # 3 nicht aufwachen):
Thread num: 1 got sync value: 3 and goes to sleep...
Thread num: 2 got sync value: 2 and goes to sleep...
Thread num: 3 got sync value: 1 and goes to sleep...
Notifying all threads!
Thread num: 1 woke up
Thread num: 2 woke up
Thread num: 3 woke up
Thread num: 2 got sync value: 3 and goes to sleep...
Thread num: 1 got sync value: 2 and goes to sleep...
Thread num: 3 got sync value: 1 and goes to sleep...
Notifying all threads!
Thread num: 2 woke up
Thread num: 1 woke up
Thread num: 2 got sync value: 3 and goes to sleep...
Thread num: 1 got sync value: 2 and goes to sleep...
Hat jemand eine Ahnung? Danke fürs Lesen.
Da jeder Thread läuft in einer Schleife, nach dem Faden 1 oder 2 aufgewacht, sync-- ausgeführt wurde, bevor Thread 3 [] {return sync == numFields;} Prädikat ausgeführt wurde. Das Prädikat wurde als falsch bewertet, sodass Thread 3 nicht aufwachte. –
Danke @TonyJ Weißt du, wie das behoben werden könnte? – siflun