CriticalSection macht keine Unterscheidung zwischen Read und Write. Der Block, den du absicherst, kann immer nur exklusiv ausgeführt werden.
ACHTUNG:
Jeder Thread (auch die nur Lesenden), der in irgendeiner Form auf den geschützten Speicherbereich zugreift, muss die selbe CriticalSection vorher betreten und nachher wieder verlassen.
Dementsprechend könnte dein Lese-Thread während eines Schreibzugriffes nicht gleichzeitig lesen. Auch könnten nicht mehrere Threads gleichzeitig lesen. Der bereits angemerkte
TMultiReadExclusiveWriteSynchronizer kann hier Abhilfe schaffen.
braucht man mit einer CriticalSection Synchronize(procedure bla.Caption := '123'; end); innerhalb eines Threads noch?
Ja, dein
GUI Thread sollte ausschließlich
Synchronize
verwenden. Wenn - wie von dir beschrieben - die Worker-Threads alle eine eigene interne Liste haben und du die Daten eh per Message an den
GUI Thread schickst, dann kannst du dir die CriticalSections sogar komplett sparen (vorrausgesetzt natürlich, dass die Message nicht nur Zeiger auf die eigentlichen Daten enthält - dann nämlich müsstest du im
GUI Thread vor dem Zugriff die jeweils korrekte CriticalSection des sendenden Threads betreten).