Zitat von
Michael_Bayer:
Also wie ich das verstanden habe, muss man vor dem kritischen Bereich (dem Ändern eines
VCL-Objektes) die "critical section" "entern" und danach wieder "leaven".
Meine Frage nun: Wenn ich die critical section betrete, woher wissen dann die anderen Threads, welches Objekt sie nicht anfassen dürfen? (Dass die Threads dann komplett stillstehen, kann ja nicht sein)
Ganz einfach. Jeder Thread der auf ein bestimmtes Objekt (sei es ein Integer, ein Array oder ein String) zugreift, sollte vorher in die Critical Section gehen. Der Code danach sollte IMMER in einem try-finally-Block stehen, damit die CritSect auch verlassen wird!
Zitat von
Michael_Bayer:
EDIT: Ahhhh verstanden
- Wenn ich eine CriticalSection betrete, dann bin nur ich darin und alle, die auch etwas "kritisches" machen wollen, müssen warten.
So muss ich überall, wo etwas zusammenhauen könnte, die CriticalSection benutzen.
Exakt. Und sobald du ein weiteres Objekt einführst wo mehrere Threads lesen und schreiben, führst du eine neue CritSect ein. So können die Threads auch dann noch die zweite Sache abarbeiten, während es bei der ersten vielleicht nicht geklappt hat.
Zitat von
Michael_Bayer:
Allerdings kommt mir das etwas.. naja.. ineffektiv vor.
Ich muss ja dann auch bei Leseoperationen auf ein Objekt, dass woanders geschrieben werden könnte, eine CriticalSection benutzen - so werden ja auch Leseoperationen serialisiert...muss das sein?
Anders geht es nicht. Denn genau das ist ja das Problem, wenn sich mehrere Codeteile eine Ressource teilen. Der Punkt ist ja gerade, daß du die Geschichte so effektiv wie möglich gestalten sollst und kannst, indem du die rechenintensiven Sachen sinnvoll trennst und parallelisierst. Das ist aber ein eigenes Themengebiet der Informatik und kann sicherlich nicht in Gänze in einem solchen Thread hier abgehandelt werden