Stefan
vor 13 Jahren
Hallo,
erstmal vorab, ich selber programmiere kaum noch in Delphi. Mein
Schwerpunkt ist Mikrocontrollerprogrammierung in Assembler und C
(WinAVR/GCC). Wir kämpfen aber aktuell mit einem Programm eines
ehemaligen Kollegen. Problem ist, das Programm hängt sich in
unregelmäßigen Abständen auf. Das können einige Stunden sein, oder auch
mal einige Wochen. Wir haben dort die diversen Threads, die insbesondere
für TCP/IP Kommunikation verwendet werden im Verdacht.
Der Kollege hat an diversen Stellen mit Synchronize gearbeitet.
Die Problematik ist dabei bekannt, zwei Threads verwenden dieselben
Datenbestände und es muss verhindert werden, dass Thread 1 von Thread 2
unterbrochen wird, während gemeinsam verwendete Daten gelesen oder
verändert werden.
In GCC löse ich das, indem ich kurzfristig alle INTs sperre, z.B.
cli(); // alle INTs sperren
datenaendern();
sei(); // INTs wieder freigeben
Jetzt habe ich bei der Dokumentation zum Thema Threads den Eindruck,
dass ich entweder zu doof bin, oder dass diese von Leuten geschrieben
bzw. übersetzt wurde, die keine Ahnung vom Thema haben, deshalb hier
einige grundsätzliche Verständnisfragen.
Was genau macht syncronize()?
Der Kollege hat hier jeweils im Thread die Prozeduren, in denen Daten
verändert oder gelesen werden mit synchronize aufgerufen.
Ich bin der Meinung, eine critical section wäre hier besser, also
EnterCriticalSection(CritSect);
datenaendern;
LeaveCriticalSection(CritSect);
Passier dabei das selbe, wie in meinem Beispiel oben, oder was läuft da
genau ab?
Gruß
Stefan
erstmal vorab, ich selber programmiere kaum noch in Delphi. Mein
Schwerpunkt ist Mikrocontrollerprogrammierung in Assembler und C
(WinAVR/GCC). Wir kämpfen aber aktuell mit einem Programm eines
ehemaligen Kollegen. Problem ist, das Programm hängt sich in
unregelmäßigen Abständen auf. Das können einige Stunden sein, oder auch
mal einige Wochen. Wir haben dort die diversen Threads, die insbesondere
für TCP/IP Kommunikation verwendet werden im Verdacht.
Der Kollege hat an diversen Stellen mit Synchronize gearbeitet.
Die Problematik ist dabei bekannt, zwei Threads verwenden dieselben
Datenbestände und es muss verhindert werden, dass Thread 1 von Thread 2
unterbrochen wird, während gemeinsam verwendete Daten gelesen oder
verändert werden.
In GCC löse ich das, indem ich kurzfristig alle INTs sperre, z.B.
cli(); // alle INTs sperren
datenaendern();
sei(); // INTs wieder freigeben
Jetzt habe ich bei der Dokumentation zum Thema Threads den Eindruck,
dass ich entweder zu doof bin, oder dass diese von Leuten geschrieben
bzw. übersetzt wurde, die keine Ahnung vom Thema haben, deshalb hier
einige grundsätzliche Verständnisfragen.
Was genau macht syncronize()?
Der Kollege hat hier jeweils im Thread die Prozeduren, in denen Daten
verändert oder gelesen werden mit synchronize aufgerufen.
Ich bin der Meinung, eine critical section wäre hier besser, also
EnterCriticalSection(CritSect);
datenaendern;
LeaveCriticalSection(CritSect);
Passier dabei das selbe, wie in meinem Beispiel oben, oder was läuft da
genau ab?
Gruß
Stefan