Asynchron / Synchron
-
Hallo alle zusammen,
Ich lerne gerade C++ und immer wieder lese ich von asynchron und synchron. Wo genau liegt der Unterschied und was hat das primär mit Threads zu tun? Ich weiß wie ich in C++ einen Thread erstelle, doch läuft dieser jetzt synchron oder asynchron. Und warum ist boost.asio asynchron? Folgenden Satz habe ich im Internet gefunden:
Often the point of asynchronous I/O is to avoid using one thread per connection, where each thread uses synchronous I/O.
Was hat das damit auf sich? Sorry falls ich mich dumm anstelle, aber es will nicht wirklich in meinen Kopf rein gehen. Habe schon jede Menge dazu gelesen aber nicht wirklich kapiert, kann mir das jemand erklären? Wär demjenigen sehr dankbar, da mich das Thema an sich interessiert.
Gruß,
Simon
-
Einfach ausgedrückt: Eine synchrone Aktion (zB. ein network send) hält den Thread an, und erst wenn sie fertig ist, geht er weiter. Eine asynchrone Aktion hält den Thread nicht an, er geht sofort weiter, und wenn sie (die Aktion) fertig ist, bekommt man irgendwie eine Benachrichtigung (zB. über eine callback-Funktion).
Generell kennt C++ kein synchron/asynchron, wenn man davon spricht, meint man meistens I/O (Netzwerk, Datei) oder thread-Synchronisation.
-
Ich habe mal auf Wikipedia nach ›asynchron‹ gesucht, dadurch wurde ich auf http://de.wikipedia.org/wiki/Asynchron#Gegenteil weitergeleitet. Dort steht dann, beim zweiten Punkt, „oder von asynchroner Kommunikation in der Netzwerktechnik“. Das, was hier unterstrichen ist, ist im Original ein Link. Folgt man ihm, so kommt man auf http://de.wikipedia.org/wiki/Asynchrone_Kommunikation. Was dort steht, entspricht zwar nicht vollkommen der Art, wie der Begriff hier verwendet wird, aber es sollte doch dafür reichen, dass man versteht, was gemeint ist.
Solltest du also jede Menge gelesen haben, so war das wohl das falsche.
-
Danke für die schnellen Antworten, also könnte man das mit einem non blocking socket aus der WinAPI vergleichen? Und warum wurde boost.asio so konzipiert, dass es immer asynchron arbeitet? Oder ist es immer besser wenn der Thread nicht blockiert?
-
Asynchrones Einlesen von Dateien ist in Echtzeitprogrammen oft unverzichtbar.
Nehmen wir mal an, du spielst ein Spiel, was neue Spiellevel ohne Ladezeit lädt (Minecraft, Risen, ...).
Wenn du ein Spiel startest wird das Startlevel und mindestens ein weiteres Level geladen, während du einen Ladebalken siehst. Auch da werden evtl. schon Threads eingesetzt. Nun spielst du und kommst zu dem zweiten geladenen Level. Sobald du das erste Level nicht mehr siehst, werden die dafür benötigten Resourcen freigegeben und das nächste Level geladen. Da das geschieht, während du spielst, wird das asynchron mit Threads ausgeführt.
Threads können auch zum Fork and Join nützlich sein, damit man Schleifenberechnungen, die länger dauern, auf mehrere Threads aufteilen kann.
-
Man kann aber auch asynchron in nur einem Thread arbeiten. Das wird leier oft vergessen.
task1(); // blockiert nicht task2(); // blockiert nicht run(); // führt tasl1 und task2 aus
-
Man kann dann einfach nur einen Thread verwenden, der ständig weiterläuft, und im Hintergrund (also asynchron) werden die langsameren Operationen durchgeführt, ist halt effektiver als immer nen extra Thread dafür zu spawnen oder den Thread zu blockieren, der eigentlich laufen soll (damit zB. ein UI responsible bleibt).