Autor Beitrag
alexschultze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: So 29.12.02 23:57 
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!
Dev4u.ch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 36



BeitragVerfasst: Mo 30.12.02 00:23 
hi..

schau mal hier..


www.tutorials.delphi-source.de/threads/


greats

_________________
Jedes Programm wurde von einem Menschen gecodet - Menschen machen nun mal Fehler!!
alexschultze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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.