Hi Leute,
irgendwie versteh ich diese ganze volatile-Geschichte nicht:
Was heißt denn hier nun "fetch them fresh". Soweit mein dürftiges Assembler-Wissen ausreicht, steht doch eine Variable bzw. der Inhalt entweder im RAM oder in einem Register, nicht aber in beiden synchron.
Demzufolge wäre mein Verständnis folgendermaßen:
- Thread A setzt die Variable int foo auf 5 und lässt sie im RAM. Thread B fragt diese nun ab und erhält auch 5 => unproblematisch.
- Thread A setzt die Variable int foo auf 5 und schreibt sie in irgendein Register aus Optimierungsgründen. Thread B fragt nun foo ab und kuckt erst im Register, sieht "aha, da ist foo" => unproblematisch.
Wo ist hier mein Denkfehler?
Oder können Variablen bzw. deren Inhalten wirklich gleichzeitig im RAM und in einem Register gespeichert werden?
Auch dann würde ich es nicht verstehen, weil sogar dann müsste Thread B doch immer erst in einem Register nachschauen (sonst würde so ein Cache doch keinen Sinn machen, oder) bevor er in den RAM kuckt, sprich immer mit der aktuellen Variante von foo arbeiten?
Oder ist es wirklich so:
- Variablen bzw. der Inhalte können sowohl im RAM als auch in einem Register gespeichert
- Threads kucken erst im RAM und dann in einem der Register
?
Dann würde volatile für mich Sinn machen, dann versteh ich aber nicht den Sinn von Caching via CPU-Registern....
irgendwie versteh ich diese ganze volatile-Geschichte nicht:
volatile
The volatile keyword is used on variables that may be modified simultaneously by other threads. This warns the compiler to fetch them fresh each time, rather than caching them in registers. This also inhibits certain optimisations that assume no other thread will change the values unexpectedly. Since other threads cannot see local variables, there is never any need to mark local variables volatile. You need synchronized to co-ordinate changes to variables from different threads, but often volatile will do just to look at them. volatile does not guarantee you atomic access, e.g. a++;
Was heißt denn hier nun "fetch them fresh". Soweit mein dürftiges Assembler-Wissen ausreicht, steht doch eine Variable bzw. der Inhalt entweder im RAM oder in einem Register, nicht aber in beiden synchron.
Demzufolge wäre mein Verständnis folgendermaßen:
- Thread A setzt die Variable int foo auf 5 und lässt sie im RAM. Thread B fragt diese nun ab und erhält auch 5 => unproblematisch.
- Thread A setzt die Variable int foo auf 5 und schreibt sie in irgendein Register aus Optimierungsgründen. Thread B fragt nun foo ab und kuckt erst im Register, sieht "aha, da ist foo" => unproblematisch.
Wo ist hier mein Denkfehler?
Oder können Variablen bzw. deren Inhalten wirklich gleichzeitig im RAM und in einem Register gespeichert werden?
Auch dann würde ich es nicht verstehen, weil sogar dann müsste Thread B doch immer erst in einem Register nachschauen (sonst würde so ein Cache doch keinen Sinn machen, oder) bevor er in den RAM kuckt, sprich immer mit der aktuellen Variante von foo arbeiten?
Oder ist es wirklich so:
- Variablen bzw. der Inhalte können sowohl im RAM als auch in einem Register gespeichert
- Threads kucken erst im RAM und dann in einem der Register
?
Dann würde volatile für mich Sinn machen, dann versteh ich aber nicht den Sinn von Caching via CPU-Registern....