Entwickler-Ecke
Sonstiges (Delphi) - Threadmanagement
alexschultze - So 29.12.02 23:57
Titel: Threadmanagement
hiho,
ich habe mal ne kleine aber für mich momentan wichtige Frage:
ich habe ein Programm, in dem neben dem Hauptthread noch zwei Nebenthreads arbeiten (werden).
Nun ist folgendes:
in dem Nebenthread läuft ne Schleife 0-100 ab, in dem er die Einträge in der Datenbank localisiert, und wo sie dann gepointet sind gleich mal noch ein oder zwei Einträge ändert.
Das Problem ist, das der andere Nebenthread zur gleichen Zeit auf diese Tabelle zugreift.
Kann ich es z.B. so machen, das die Threads nicht gemixt und gleichzeitig, sondern 'blockweise' arbeiten?
Das zum Beispiel der eine Thread irgendeine der Zahlen zw. 0-100 in der Vorschleife anfängt zu bearbeiten, den Prozess (die for-Anweisung) für die Zahl komplett abarbeitet und erst dann wieder ein anderer THread 'drankommt'?
Ich weiß nicht ob das vielleicht sogar schon so ist, glaub ich aber weniger!
alexschultze - Mo 30.12.02 11:29
mh. gut gut. Da steht etwas von synchronisiertem Multithreading:
| Zitat: |
Threads: Thread-Synchronisierung
Beim synchronisierten Multithreading gelten folgende Regeln:
Nur ein Thread darf zur gleichen Zeit die Daten verändern.
Während ein Thread die Daten verändert, darf kein zweiter Thread die Daten lesen.
Während ein Thread die Daten liest, darf kein zweiter Thread die Daten verändern.
Während ein Thread die Daten liest, dürfen alle anderen Threads auch die Daten lesen.
|
Wie erreiche ich synchronisiertes Multithreading? Ist das möglicherweise schon standardmäßig aktiviert?
Ich weiß trotzdem nicht wirklich mehr als vorher. Diese Scheibeneinteilung (der Begriff der verwendet wurde gefällt mir nicht) bewirkt ja, das es ständig /einen/ arbeitenden Thread gibt.
Ja, schön und gut, aber für einen mikroskopisch kleinen Zeitraum! Er sollte die gesamte Schleife durchlaufen, und nicht nur immer Stückchen nach Stückchen.
okay? alex
Udontknow - Mo 30.12.02 11:50
Hi!
| Zitat: |
| Er sollte die gesamte Schleife durchlaufen, und nicht nur immer Stückchen nach Stückchen. |
Ich glaube, du verstehst da irgendetwas nicht ganz. So arbeiten nun mal Threads. Sie kriegen ihre CPU-Zeit, arbeiten, und machen dann Pause, damit andere Threads auch was machen können. Trotzdem wird natürlich die zu erledigende Arbeit auch getan (die ganze Schleife durchlaufen). Nur wahrscheinlich nicht in einer einzigen Zeitzuteilung.
Mit Synchronisiertem MT meint man einfach, dass mehrere Threads auf ein und dieselben Daten zugreifen müssen (z.B. dieselbe Tabelle). Unsynchronisiert wäre es, wenn der eine Thread in Datei A liest und schreibt, der andere in Datei B. Es gibt keine möglichen Konflikte, deshalb muss man auch nicht aufpassen, dass nicht beide zur gleichen Zeit in dieselben Speicherbereiche schreiben wollen.
Du musst nun deine Threads synchronisieren, damit nicht beide den gleichen Datensatz abändern. Z.B. den ersten Thread die DS 1-100 erledigen lassen, und dem zweiten den Bereich 101-200 zuweisen.
Sobald einer von beiden fertig ist, musst du entweder per Synchronize oder per TCriticalSection einen neuen, gerade nicht benutzten Bereich zuweisen und erneut starten (sofern noch Bereiche da sind die zu bearbeiten sind).
Mal eine Frage: Wofür benötigst du 2 Threads, die
nacheinander ausgeführt werden sollen? Das ergibt doch keinen Sinn, das kann auch einer alleine tun.
Thread-Verwendung & (SQL-)Datenbanken ist sowieso eine kritische Sache...
Cu,
Udontknow
alexschultze - Mo 30.12.02 20:24
nun ja.
Also, wie gesagt. Jetzt kommen Datenbanken ins Spiel.
mit locate eines Datensatzes, steht der Pointer auch auf /diesem/ Datensatz, so das ich dann die einzelnen Felder auslesen kann.
Nun würde es aber so sein, das ich mehrere Threads auf diese Table zugreifen lassen müsste, die im Grunde alle das Gleiche ausführen, also Locate, Daten bearbeiten, ... in derselben Tabelle.
Nun wird es eben scheibenweise eingeteilt. Und ich will mich vor dieser Programmreihenfolge schützen:
Thread1 - locate(Datensatz 1);
Thread2 - locate(Datensatz 2);
THread1 - Editiere Feld 1;
Nun würde THread 1 nicht den Datensatz 1 sondern 2 bearbeiten.
Das ist meiN Problem.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!