Also versuche ich ein einfaches Multithreading-Programm, das die Collatz-Vermutung für eine große Anzahl von Zahlen validiert und die Gesamtzahl der validierten Zahlen zurückgibt. Jeder Thread (insgesamt 4) macht ein Intervall von Zahlen und aktualisiert die "validierte" Variable, wenn eine Zahl 1 erreicht. Ich bin auch Timing der gesamte Prozess (zum Vergleich vs eine Einzel-Thread-Berechnung)Einfache Multi-Threading-Hilfe? C++, WaitForSingleObject und Synchronisation
Das Problem, das ich bin Das heißt, dass es nie eine Konsistenz gibt, wenn ich das "validierte" int am Ende des Programms ausdrucke, so denke ich, dass entweder die Threads übereinander geschrieben werden, oder der Hauptthread vor den anderen endet und somit gedruckt wird eine unvollständige Nummer. Ich gehe auch davon aus, dass die Uhr() Berechnungen auch aus sind, wenn der Hauptthread vor den anderen fertig ist. Also, wie STOPP ich den Haupt-Thread fortfahren, bis die anderen Threads abgeschlossen sind (so dass es auf eine aktualisierte validierte Anzahl warten und eine genaue Zeitmessung durchführen)? Dies ist, was ich dachte, dass WaitForSingleObject das getan hat, aber ich schätze, es stoppt nur den Haupt-Thread von EXITING und erlaubt ihm immer noch, seine anderen Funktionen zu berechnen.
Dies ist mein erster Schritt bei jedem Multithreading, und ich glaube nicht, dass ich die Funktionsweise der Synchronisation und des WaitForSingleObject-Befehls verstehe. Hier ist, was ich bisher in meiner Hauptfunktion habe:
EDIT: Hier ist meine aktualisierte Hauptfunktion und Collatz Funktion. Ich änderte es so, dass jeder Thread auf eine separate Variable zugreift, um das Synchronisationsproblem zu vermeiden, aber das Problem besteht immer noch. Es gibt keine konsistenten Wert, wenn ich drucken „validiert“ *
Erneut bearbeiten: Okay, so dass ich entfernt den „Faden“ int pro Mladen Jankovic, und verwendet nur einen einfachen Zähler, um die unterschiedlichen Intervallen zu verteilen die erstellten Threads. Es gibt jetzt einen konsistenten, korrekten Wert für "validiert". JEDOCH kann ich das Programm noch nicht fertigstellen, wenn es 1.000.000 Nummern gibt. Testen Sie es für 100.000 oder sogar 10.000 funktioniert einwandfrei, aber wenn ich es auf 1.000.000 Zahlen aufstocken, läuft das Programm unbegrenzt (Stunden), ohne tatsächlich eine Werte zurückgeben. Ich vermute, dass es bei einem bestimmten Wert hängen bleibt (zB 750831, wie Martin James darauf hingewiesen hat). Ich habe versucht, Int für Long Int zu ersetzen, aber es scheint, dass es immer noch unter Überlauf leidet. Irgendwelche Vorschläge? Und danke für die immense Hilfe.
LAST EDIT: Okay, so dass ich nur lange lange statt int und jetzt das Programm funktioniert einwandfrei verwendet. Danke für die Hilfe alle!
void main()
{
clock_t start;
clock_t finish;
unsigned int thread = 0;
start = clock();
HANDLE h1 = (HANDLE)_beginthreadex(NULL, 0, collatz_thread, NULL, 0, NULL);
HANDLE h2 = (HANDLE)_beginthreadex(NULL, 0, collatz_thread, NULL, 0, NULL);
HANDLE h3 = (HANDLE)_beginthreadex(NULL, 0, collatz_thread, NULL, 0, NULL);
for (int i = 750001 ; i <= 1000000 ; i++) { collatz(i, 4); }
WaitForSingleObject(h1, INFINITE);
WaitForSingleObject(h2, INFINITE);
WaitForSingleObject(h3, INFINITE);
finish = clock() - start;
double time = finish/(double) CLOCKS_PER_SEC;
validated = v1 + v2 + v3 + v4;
cout << validated << " numbers validated." << endl;
cout << endl << time << " seconds." << endl;
}
unsigned _stdcall collatz_thread (void* n)
{
selection++; // selects a different interval each time collatz_thread is called
switch (selection) {
case 1:
for (int i = 1 ; i <= 250000; i++) { collatz(i, 1); }
break;
case 2:
for (int i = 250001 ; i <= 500000; i++) { collatz(i, 2); }
break;
case 3:
for (int i = 500001 ; i <= 750000; i++) { collatz(i, 3); }
break;
}
return 0;
}
int collatz (int n, int thread)
{
int original = n;
while (n != 1) {
if (n%2 == 0)
n = (n/2);
else
n = (3*n + 1);
}
if (n == 1) {
switch (thread) {
case 1:
v1++;
break;
case 2:
v2++;
break;
case 3:
v3++;
break;
case 4:
v4++;
break;
}
return n;
}
}
Siehe meine aktualisierte Antwort und Code für Collatz_Thread-Funktion bereitstellen. –
Okay, los gehts. Ich habe den Beitrag auch mit weiteren Informationen zu meinem aktuellen Problem aktualisiert. – Vance