Einstiegsfragen zu Threads



  • Hallo in die Runde,

    ich bin zurzeit dabei mich in das Thema Threads einzuarbeiten und habe die eine oder andere "Anfänger-"Frage dazu.

    Erstmal die Situation:
    Ich arbeite an einem Programm, das als Server arbeiten soll und daher unter anderem eine Netzwerkschnittstelle besitzt. Die Schnittstelle besteht aus einem Socket und ein paar nachfolgenden Klassen, die die empfangenen Daten vorverarbeiten, bevor sie an die eigentliche Programmlogik weitergereicht werden.
    Damit sich die Serverlogik und die Netzwerkschnittstelle nicht gegenseitig blockieren, möchte ich mit Multithreading arbeiten.

    So wie ich die Threads bis jetzt verstehe ist es nicht möglich vereinfacht gesagt einen Thread zu erstellen, die Klassen in diesem Thread zu instanzieren und irgendwann am Programmende diesen Thread wieder zu beenden, das wäre dann mehr oder weniger ein eigener Prozess. Es ist nur möglich eine Funktion/Methode in einem neuen Thread zu starten, die dann wieder weitere Funktionen/Methoden aufruft, die dann in dem gleichen Thread laufen. Ist das soweit korrekt?

    Was wäre in diesem Fall sinnvoller: Die Netzwerkschnittstelle in einen eigenen Prozess auslagern oder mit Threads arbeiten? Ich weiß, die Frage ist seeehr unscharf und situationsabhängig 🙂 Threads sind einfacher und sicherer, ein Prozess läuft komplett parallel. Wie sieht die übliche Implementierung aus wenn man viel Netzwerktraffic hat?

    Eine weitere Frage ist der Zugriff auf Membervariablen bei mehreren Threads. Angenommen ich habe eine Klasseninstanz, auf die mehrere Threads "gleichzeitig" zugreifen und Membervariablen verändern, im konkreten Fall eine Std-Queue. Dann muss ich doch mit einem Mutex den Zugriff auf die Queue regeln, damit keine race-condition auftritt, richtig?

    Wie kann ich zwischen den Threads Daten austauschen? Irgendwann ist ein Thread an seinem Ende angelangt und es liegen Daten vor, die an die Serverlogik gehen sollen, die im eigentlich "Hauptthread" des Programms läuft. Wie kann ich da am sinnvollsten die Daten übergeben?

    Man sieht, dass ich bei dem Thema noch sehr am Anfang stehe und noch viel grundlegendes nicht verstanden habe 🙂

    Ich danke im voraus für eure Antworten



  • Cherup schrieb:

    So wie ich die Threads bis jetzt verstehe ist es nicht möglich vereinfacht gesagt einen Thread zu erstellen, die Klassen in diesem Thread zu instanzieren und irgendwann am Programmende diesen Thread wieder zu beenden,

    Das ist falsch.

    Cherup schrieb:

    das wäre dann mehr oder weniger ein eigener Prozess.

    Ein Thread ist ein Thread, da wird kein Prozess draus.

    Cherup schrieb:

    Es ist nur möglich eine Funktion/Methode in einem neuen Thread zu starten, die dann wieder weitere Funktionen/Methoden aufruft, die dann in dem gleichen Thread laufen. Ist das soweit korrekt?

    Das ist korrekt, steht aber nicht im Widerspruch zu deinem Wunsch. main ist auch nur eine Funktion.

    Cherup schrieb:

    Man sieht, dass ich bei dem Thema noch sehr am Anfang stehe und noch viel grundlegendes nicht verstanden habe 🙂

    Es wird nicht reichen, ein paar Fragen in einm Forum zu stellen...



  • Danke für deine Antworten.

    manni66 schrieb:

    Ein Thread ist ein Thread, da wird kein Prozess draus.

    Das aus einem Thread kein Prozess wird ist mir klar 🙂

    manni66 schrieb:

    Cherup schrieb:

    So wie ich die Threads bis jetzt verstehe ist es nicht möglich vereinfacht gesagt einen Thread zu erstellen, die Klassen in diesem Thread zu instanzieren und irgendwann am Programmende diesen Thread wieder zu beenden,

    Das ist falsch.

    Das ist sehr hilfreich, danke. Also geht es doch und ich weiß nur noch nicht wie.

    manni66 schrieb:

    Cherup schrieb:

    Man sieht, dass ich bei dem Thema noch sehr am Anfang stehe und noch viel grundlegendes nicht verstanden habe 🙂

    Es wird nicht reichen, ein paar Fragen in einm Forum zu stellen...

    Auch das ist mir bewusst. Um das zu verstehen muss ich lesen, lernen, damit rumspielen, viiiiele Fehler machen, wieder lesen und lernen usw 😉
    Aber es hilft, wenn ich ein paar Verständnisfragen hier klären kann 🙂



  • also im prinzip ist ein thread eine funktion, die gleichzeitig (bzw. abwechselnd) mit der mainfunktion ausgeführt wird und auf die selben globalen variablen sowie auf den übergebenen parameter (bei mehreren variablen bietet sich hier eine struktur oder klasse an) vollständig zugreifen kann. du kannst von dort aus auch weitere threads starten.

    Cherup schrieb:

    So wie ich die Threads bis jetzt verstehe ist es nicht möglich vereinfacht gesagt einen Thread zu erstellen, die Klassen in diesem Thread zu instanzieren und irgendwann am Programmende diesen Thread wieder zu beenden, das wäre dann mehr oder weniger ein eigener Prozess. Es ist nur möglich eine Funktion/Methode in einem neuen Thread zu starten, die dann wieder weitere Funktionen/Methoden aufruft, die dann in dem gleichen Thread laufen. Ist das soweit korrekt?

    doch genau das kannst du. weil der übergebene parameter ein voidzeiger ist, kannst du wenn du willst sämtliche daten übergeben und spätestens nach ende des threads sind die daten wieder in der mainfunktion.

    Was wäre in diesem Fall sinnvoller: Die Netzwerkschnittstelle in einen eigenen Prozess auslagern oder mit Threads arbeiten? Ich weiß, die Frage ist seeehr unscharf und situationsabhängig 🙂 Threads sind einfacher und sicherer, ein Prozess läuft komplett parallel. Wie sieht die übliche Implementierung aus wenn man viel Netzwerktraffic hat?

    machs ruhig in einen thread. eine möglichkeit wäre, ein array mit datenlänge als parameter zu übergeben und diese datenlänge zu pollen.

    Eine weitere Frage ist der Zugriff auf Membervariablen bei mehreren Threads. Angenommen ich habe eine Klasseninstanz, auf die mehrere Threads "gleichzeitig" zugreifen und Membervariablen verändern, im konkreten Fall eine Std-Queue. Dann muss ich doch mit einem Mutex den Zugriff auf die Queue regeln, damit keine race-condition auftritt, richtig?

    das ist richtig. daten auf die mehrere threads schreibend zugreifen werden mit einem mutex (oder semaphor, oder, oder) geschützt.

    Wie kann ich zwischen den Threads Daten austauschen? Irgendwann ist ein Thread an seinem Ende angelangt und es liegen Daten vor, die an die Serverlogik gehen sollen, die im eigentlich "Hauptthread" des Programms läuft. Wie kann ich da am sinnvollsten die Daten übergeben?

    wie gesagt: du übergibst der funktion ("threadprozedur") einen zeiger.
    du erinnerst dich doch noch an das beispiel "swap(int a,int b) vs. swap(int *a, int *b)"?

    Man sieht, dass ich bei dem Thema noch sehr am Anfang stehe und noch viel grundlegendes nicht verstanden habe 🙂

    also hast du noch ganz ordentlich was zu tun. 😉


Anmelden zum Antworten