C++ "Multitasking" in C++

gamemammut

mammut
25 Mai 2007
800
71
Hallo,

"Multitasking" ist vielleicht das falsche Wort, aber mir fällt nicht ein wie ich es sonst nennen soll. Vielleicht könnt Ihr mir ja ein Stichwort nennen, mit dem ich dann evtl. auch google fragen kann.

Und zwar möchte ich zum Beispiel in einem Programm Ziffern hochzählen lassen, gleichzeitig möchte ich aber noch andere Aktionen ausführen, Beispielsweise 2 Werte eingeben lassen und diese addieren.
Der Zähler soll aber immer hochzählen, auch wenn grad keine Tasteneingabe stattfindet.

Könnt Ihr mir da ein paar Tipps, oder Denkanstöße geben. Bin noch Anfänger in Sachen C++.
 
Ja, das is Multitasking.
Das Zauberwort, was du in Google eingibst, is "Thread".

Aber Tipp: Wenn du die Sprache noch gar nicht beherrscht, ist Multitasking der falsche Start.
 
Das ist ja dann doch schon etwas Komplexer.

Hab bis jetzt nur etwas in C gemacht, um mal ein paar Leds oder Led-Matrix an µC anzusteuern. Jetzt ist in der Schule C++ dazugekommen, ich denke aber nicht das wir bis zum Multitasking kommen werden.
 
Das ist ja dann doch schon etwas Komplexer.
Es is halt eine ganz andere Denkweise, wenn du mehrere Threads parallel hast.

Um mal ein Beispiel zu machen. Stell dir vor, du hast 2 Threads, die parallel ablaufen. Thread 1 inkrementiert eine Variable. Thread 2 gibt die Variable aus.
PHP:
int foo = 0;

void thread1() {
  foo++;
}

void thread2() {
  printf("foo = %d\n", foo);
}
Ohne groß nachzudenken, geht man davon aus, dass die Ausgabe
Code:
foo = 1
foo = 2
foo = 3
foo = 4
foo = 5
foo = 6
...
sein wird.

Tatsächlich kann aber sowas rauskommen:
Code:
foo = 0
foo = 1
foo = 2
foo = 2
foo = 4
foo = 6
foo = 5
foo = 154572458
foo = -5787547
foo = 42
...
 
Ohne groß nachzudenken, geht man davon aus, dass die Ausgabe sein wird.[...]

du solltest wenn du solch ein Beispiel bringst auch den Grund nennen, sonst machst du Threads zu einem Mysterium.

Ohne korrekte Synchronisierung, die wirklich nicht einfach ist, können viele Fehler auftreten, die sehr schwer zu finden sind.
In theHackers Beispiel haben wir das Problem, dass er auf die Variable ohne Synchronisierung zugegrifen hat, dadurch kann ein Thread auf alte Werte aus dem Arbeitsspeicher zugreifen (lesend) während der andere in die Register der CPU schreibt und die Werte nur selten in den Arbeitsspeicher kopiert werden, dadurch sieht der lesende Thread unter Umständen falsche (alte) Werte: stale Data
 
Du könntest sowas auch ohne Multitasking schreiben, aber dann wird's furchtbar kompliziert, etwa so

Code:
while (true)
{
    ist eine Taste gedrückt?
    ja:
        ist es die Returntaste?
        ja:
            dann ist der Eingabestring zu ende
        nein:
            füge das Zeichen zum Eingabestring hinzu
    weiterzählen;
}

Das ganze kann noch beliebig verkompliziert werden, beispielsweise indem man das letzte Zeichen im eingabestring löscht, wenn die Backspacetaste gedrückt wurde...