© Alvaro Cabrera Jimenez/Shutterstock.com
Java Magazin
Teil 3: Beschränkte Nebenläufigkeit, deterministisches Verhalten

Koroutinen in Kotlin: Structured Concurrency

Koroutinen implementieren das Konzept Structured Concurrency. Dieses Konzept beschränkt bewusst die Stellen, an denen es möglich ist, nebenläufige Aktivitäten zu starten. Im Gegenzug wird die Verständlichkeit und Nachvollziehbarkeit von nebenläufigen Koroutinen verbessert. Zusätzlich wird die Fehlerbehandlung deterministisch und es wird sichergestellt, dass keine Zombiekoroutinen entstehen.

René Preißel


ArtikelserieTeil 1: Koroutinen in Kotlin – eine EinführungTeil 2: Asynchrone Kommunikation mit Channels und Co.Teil 3: Beschränkte Nebenläufigkeit, deterministisches Verhalten

In den ersten beiden Artikeln über Koroutinen [1] wurden die Grundlagen für sequenzielle und nebenläufige Koroutinen an verschiedenen praktischen Beispielen gezeigt. Dieser Teil fokussiert sich auf die Mechanismen und Konzepte, die hinter den Koroutinen stecken. Insbesondere das Thema Fehlerbehandlung, das bisher ignoriert wurde, soll dieses Mal behandelt werden.

Der vollständige Quellcode zu diesem Artikel ist unter [2] zu finden.

Ein bisschen Informatikgeschichte zu „goto“

Die meisten Leser werden irgendwann einmal von dem Beitrag „Go To Statement Considered Harmful“ von Edsger Dijkstra [3] gehört haben. Diese Arbeit ist eine der Grundlagen der strukturierten Programmierung und somit die Basis der meisten aktuellen Programmiersprachen. Für diejenigen, die das klassische goto nicht mehr kennen, kommt hier eine kleine Auffrischung des Konzepts und der Probleme.

In einigen Programmiersprachen ist es mit goto möglich, beliebig zwischen Programmteilen zu switchen. Man kann also mitten aus einer Funktion in eine andere Funktion springen. Als Veranschaulichung soll ein kleines C-Programm dienen, siehe Listing 1.

Listing 1jmp_buf go; void helper() { printf("Zwei, "); // Springe zum „If“ in der Main-Funktion und liefere dort 1 zurück longjmp(go,1); } int main(int argc, char *argv[]) { printf("Eins, "); // Bereitet den Sprung vor und liefert 0 beim initialen Aufruf zurück. // Nach dem longjmp wird dagegen 1 geliefert. Deswegen wird das if // nur einmal beim ersten Aufruf durchlaufen. if (!setjmp(go)) { helper(); // Wird nicht erreicht werden printf("Drei, "); } printf("Vier \n");}

Die C-Syntax in diesem Beispiel ist Java sehr ähnlich und sollte kein Problem darstellen. Das Entscheidende an diesem Code sind die beiden Funktionen setjmp und longjmp. Die erste Funktion merkt sich eine Programmstelle inklusive Aufrufstack in einer Variable (go). Zu dieser Stelle wird in der helper()-Funktion mit longjmp gesprungen. Das führt dazu, dass der Aufruf der helper()-Funktion nicht wie erwartet zurückkommt und „Drei“ ausgegeben wird, sondern dass die helper()-Funktion zu dem if-Statement in der main()-Funktion springt. Da diese Sprünge prinzipiell jederzeit passieren können und die Aufrufhierarchie von Funktionen völlig ignoriert wird, kann man durch das Lesen einzelner Programmstellen d...

Java Magazin
Teil 3: Beschränkte Nebenläufigkeit, deterministisches Verhalten

Koroutinen in Kotlin: Structured Concurrency

Koroutinen implementieren das Konzept Structured Concurrency. Dieses Konzept beschränkt bewusst die Stellen, an denen es möglich ist, nebenläufige Aktivitäten zu starten. Im Gegenzug wird die Verständlichkeit und Nachvollziehbarkeit von nebenläufigen Koroutinen verbessert. Zusätzlich wird die Fehlerbehandlung deterministisch und es wird sichergestellt, dass keine Zombiekoroutinen entstehen.

René Preißel


ArtikelserieTeil 1: Koroutinen in Kotlin – eine EinführungTeil 2: Asynchrone Kommunikation mit Channels und Co.Teil 3: Beschränkte Nebenläufigkeit, deterministisches Verhalten

In den ersten beiden Artikeln über Koroutinen [1] wurden die Grundlagen für sequenzielle und nebenläufige Koroutinen an verschiedenen praktischen Beispielen gezeigt. Dieser Teil fokussiert sich auf die Mechanismen und Konzepte, die hinter den Koroutinen stecken. Insbesondere das Thema Fehlerbehandlung, das bisher ignoriert wurde, soll dieses Mal behandelt werden.

Der vollständige Quellcode zu diesem Artikel ist unter [2] zu finden.

Ein bisschen Informatikgeschichte zu „goto“

Die meisten Leser werden irgendwann einmal von dem Beitrag „Go To Statement Considered Harmful“ von Edsger Dijkstra [3] gehört haben. Diese Arbeit ist eine der Grundlagen der strukturierten Programmierung und somit die Basis der meisten aktuellen Programmiersprachen. Für diejenigen, die das klassische goto nicht mehr kennen, kommt hier eine kleine Auffrischung des Konzepts und der Probleme.

In einigen Programmiersprachen ist es mit goto möglich, beliebig zwischen Programmteilen zu switchen. Man kann also mitten aus einer Funktion in eine andere Funktion springen. Als Veranschaulichung soll ein kleines C-Programm dienen, siehe Listing 1.

Listing 1jmp_buf go; void helper() { printf("Zwei, "); // Springe zum „If“ in der Main-Funktion und liefere dort 1 zurück longjmp(go,1); } int main(int argc, char *argv[]) { printf("Eins, "); // Bereitet den Sprung vor und liefert 0 beim initialen Aufruf zurück. // Nach dem longjmp wird dagegen 1 geliefert. Deswegen wird das if // nur einmal beim ersten Aufruf durchlaufen. if (!setjmp(go)) { helper(); // Wird nicht erreicht werden printf("Drei, "); } printf("Vier \n");}

Die C-Syntax in diesem Beispiel ist Java sehr ähnlich und sollte kein Problem darstellen. Das Entscheidende an diesem Code sind die beiden Funktionen setjmp und longjmp. Die erste Funktion merkt sich eine Programmstelle inklusive Aufrufstack in einer Variable (go). Zu dieser Stelle wird in der helper()-Funktion mit longjmp gesprungen. Das führt dazu, dass der Aufruf der helper()-Funktion nicht wie erwartet zurückkommt und „Drei“ ausgegeben wird, sondern dass die helper()-Funktion zu dem if-Statement in der main()-Funktion springt. Da diese Sprünge prinzipiell jederzeit passieren können und die Aufrufhierarchie von Funktionen völlig ignoriert wird, kann man durch das Lesen einzelner Programmstellen d...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang