AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie kann man das Ausführen der Threads Priorisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann man das Ausführen der Threads Priorisieren

Ein Thema von ManSues · begonnen am 25. Mär 2014 · letzter Beitrag vom 26. Mär 2014
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.585 Beiträge
 
Delphi 12 Athens
 
#1

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 19:05
Die Thread-Prioritäten zu ändern kann durchaus auch unerwünschte Nebenwirkungen haben.
Und wenn genügend CPU-Kerne frei sind, dann bringt es auch absolut nichts.
Denn selbst wenn ein Thread eine geringere Prio hat, wie ein anderer Thread, so kann es dennoch sein, daß der mit der geringeren Prio genauso schnell oder sogar schneller ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
ManSues

Registriert seit: 22. Sep 2012
Ort: Wittmund
9 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 20:40
Das mit den Events ist ein sehr interessanter und konstruktiver Vorschlag, danke.
Vielleicht habe ich mich mit dem Wort "Priorität" falsch ausgedrückt. Ich meinte nicht die Thread-Priorität. Man kann es auch einfach als Umschalter sehen zwischen füllen und leeren. Und schließlich muss mehr geleert werden als gefüllt, sonst funktioniert es nicht. Da ist es auch OK, wenn ein Füller wartet. Also ganz primitive betrachtet eine einfache Serialisierung.

Jeder DLL eine eigene Liste zu geben würde den Aufwand produzieren, dass wieder die DLL Listen gelockt und verwaltet werden müssten.

Man kann es auch mal ganz extrem sehen (was auch möglich wäre): Es gibt 100 Nebenthreads die fast gleichzeitig schreiben wollen. Da wäre der Hauptthread lange am warten, bis er wieder dran kommt (in Versuch nachgewiesen!)
Manfred Süsens

Geändert von ManSues (25. Mär 2014 um 20:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 21:00
Das mit dem Event kann man auch umdrehen.

Wenn der Sende-Thread lesen möchte, dann wird der Event zurückgesetzt und alle Empfangs-Threads werden durch den Event aufgehalten und können erst mal nicht mehr schreiben.
Ist der Sende-Thread fertig mit lesen, dann setzt der wieder den Event und alle schreiben wieder lustig in die Liste.

Dazu muss der Event wie folgt initialisiert werden:
Delphi-Quellcode:
TEvent.Create(
  nil,
  True, {ManualReset}
  True, {InitialState}
  '' );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 21:09
Jeder DLL eine eigene Liste zu geben würde den Aufwand produzieren, dass wieder die DLL Listen gelockt und verwaltet werden müssten.
Was ist daran mehr Aufwand? Aktuell lockst du doch auch bei jedem Zugriff eine Liste.

Man kann es auch mal ganz extrem sehen (was auch möglich wäre): Es gibt 100 Nebenthreads die fast gleichzeitig schreiben wollen. Da wäre der Hauptthread lange am warten, bis er wieder dran kommt (in Versuch nachgewiesen!)
In dem Fall wäre dann die Thread-Priorität eigentlich schon die richtige Stellschraube.

Edit: Falls es nicht klar war, jede Liste hätte natürlich auch ihr eigenes Lock. Sonst wäre die Sache witzlos.

Geändert von Namenloser (25. Mär 2014 um 21:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 21:16
Man kann es auch mal ganz extrem sehen (was auch möglich wäre): Es gibt 100 Nebenthreads die fast gleichzeitig schreiben wollen. Da wäre der Hauptthread lange am warten, bis er wieder dran kommt (in Versuch nachgewiesen!)
In dem Fall wäre dann die Thread-Priorität eigentlich schon die richtige Stellschraube.
Nicht wirklich. Daran schrauben ist schon ok und sollte man wohl auch machen, aber als richtige Lösung ist das nicht zu sehen, da man sich hier auf eine Verhalten stützt, was man selber nicht wirklich in der Hand hat.
Und wirklich viele Prioritäts-Stufen hat man nicht (ist auch unnötig), so dass die echte Kontrolle immer selber erfolgen sollte. Die Priorität ist nur unterstützend zu sehen und hilft dem Betriebssystem beim Verteilen der Zeitscheiben.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 21:58
Aber wenn man 100 laufende Threads auf z.B. 4 Kerne verteilen muss, dann ist das Problem wirklich, dass man 100 laufende Threads auf 4 Kerne verteilen muss, und nicht mehr, dass einer der Threads zu langsam ist. Und dann sollte man lieber auf den Scheduler des Betriebssystems vertrauen und ihm die entsprechenden Informationen liefern statt seine eigene Suppe zu kochen.

Geändert von Namenloser (25. Mär 2014 um 22:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 22:16
Ähm, er hat nicht berichtet, dass sein System eingefroren ist, und das wäre der Fall, wenn 100 Threads die volle Aufmerksamkeit der CPU beanspruchen würden.

Können die auch gar nicht, da alle Threads in eine Liste schreiben wollen und das können die nun mal nicht gleichzeitig. Also sind 99 Threads am Warten und 1 Thread am Schreiben.

Sein Problem ist jetzt, dass er mit dem Thread zum Weiterreichen (Lesen aus der Liste) nicht mehr so richtig dazwischenkommt. Also braucht er eine Logik, die dieses Auslesen priorisiert.

Jetzt stehen 99 Schreib-Threads an der CriticalSection und der Lese-Thread hängt hinten dran und muss abwarten, bis diese 99 abgearbeitet sind.
Wenn die Schreib-Threads jetzt eine geringere Priorität bekommen, dann könnte es sogar noch langsamer werden.

Ich glaube das ist nicht gewollt
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 22:25
Ähm, er hat nicht berichtet, dass sein System eingefroren ist, und das wäre der Fall, wenn 100 Threads die volle Aufmerksamkeit der CPU beanspruchen würden.

Können die auch gar nicht, da alle Threads in eine Liste schreiben wollen und das können die nun mal nicht gleichzeitig. Also sind 99 Threads am Warten und 1 Thread am Schreiben.
Dafür habe ich ja auch eine Lösung genannt (eine andere als du): Pro Thread eine separate Liste (bzw. Queue). Natürlich muss man sich irgendwas überlegen, damit die zu „schnellen“ Threads nicht den kompletten Speicher zumüllen, weil der Main-Thread nicht dazu kommt, die Queue schnell genug abzuarbeiten. Aber was man da am besten macht, kommt auf die Anwendung an. Man könnte z.B. ein Limit an Einträgen setzen, und wenn das Limit erreicht ist, dann wartet der schreibende Thread, bis wieder ein Eintrag frei wird (dein Vorschlag ist sozusagen ein Spezialfall davon – Limit von genau einem Eintrag), oder der älteste Eintrag wird überschrieben o.ä..

Ich meine nur, das ist ein ganz anderes Problem als das Problem, dass der Main-Thread nur in sehr großen Abständen mal eine Zeitscheibe abbekommt. Es sind zwei verschiedene Probleme.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#9

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 26. Mär 2014, 12:37
Nur so als Denkanstoß:

Lasse die Schreibe-Threads in eine Warteschlange A schreiben, erzeuge einen weiteren Thread, der aus dieser Warteschlange A jeweils blockweise in eine andere Warteschlange B überträgt.

Der "HauptThread" entnimmt seine Aufträge aus B, und bearbeitet sie.

Wenn das noch nicht reicht, kann auch der Hauptthread Blockweise alle in B enthaltenen Aufträge entnehmen.

So wird der Hauptthread nicht mit Wartereien aufgehalten.

Edit: weitere Idee:
Die Warteschlangenverwaltung holt immer, wenn eine Änderung passiert (die Warteschlange also sowieso gesperrt ist), den nächsten Auftrag bereits vorsorglich bereit, dann braucht für dessen Abholen nicht gesperrt werden.

Geändert von Mikkey (26. Mär 2014 um 14:28 Uhr)
  Mit Zitat antworten Zitat
ManSues

Registriert seit: 22. Sep 2012
Ort: Wittmund
9 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 26. Mär 2014, 06:43
Hi Sir Rufo,

danke für den 2. Hinweis. Genau so brauche ich es. Denn wenn es nichts zu senden gibt, sollen die Clients in die Liste ja ungehindert schreiben können. Damit wäre auch der Charakter des Multithreading wieder vorhanden, eben nur mit einen Thread-König, der das sagen hat. So wie ich dem Thread-König sein Thread-Sleep einstelle, verschiebe ich die Zeitscheibe für schreiben und lesen. Effekt ganz nebenbei: Die Clients schreiben nicht nur, sondern packen die Daten auch in schon vorhandene Telegramme, also packen Telegramme voll damit der Overhead zu den Nutzdaten klein bleibt.
Du siehst, es ist eine feine Abstimmung, damit es richtig funktioniert. Aber jetzt habe ich wenigstens eine Stellschraube!
Manfred Süsens
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz