Dit snap ik even niet. In welke situatie zou ie nou precies geen voorrang krijgen? Voorrang waarop?
Maar hoe weet die ene thread dan dat hij 10 moet inlezen en niet die 20 vast moet houden die nog in de write cache staat?
Dat weet hij niet, en dus zal hij de 20 inlezen. Wat ik suggereerde is dat de write cache geflushed (+ geinvalideerd) kan worden voor hij de waarde output. Bij een flush/invalidate zal hij voor de volgende read van x dus mogelijk 10 lezen, omdat dat in main mem is gezet na de flush van de 20. Daar is helemaal geen dirty checking voor nodig.
Wat je ook niet moet vergeten is dat als beide threads op verschillende CPUs gescheduled worden, maar dat thread2 na de write van 20 weer op de ene gescheduled wordt, er dus nooit een 20 in z'n cache kan staan - het is immers een fysieke andere CPU waar de code ineens op draait, met z'n eigen cache. Om dit fatsoenlijk te laten werken moet het OS de caches wel geflusht en geinvalidate hebben.
Ik snap niet hoe je erbij komt dat een cache altijd geflushed zou moeten worden?
Dat zeg ik helemaal niet, waar staat dat precies? Ik zeg dat de cache
mogelijk geflushed is, en als dat zo is dan zie je de 20 niet meer in je lokale cache, maar lees je de 10 uit main mem.
Dit is een theoretische discussie en we mogen dus alleen uitgaan van de garanties die de specs bieden.
Duh, ik heb me in geen moment vastgepind op een specifieke CPU. Op intel gaat het niet eens op omdat die volgens mij een gesharede L2 cache hebben
Overigens ging het erom of je wel of niet een 0 zou kunnen krijgen, niet of je al dan niet een 10 zou kunnen zien. En ik zeg dat dat niet kan, omdat die write van 20 nooit gecanceled kan worden, hij kan slechts overridden worden door een write ná de write van 20 (door een andere thread), en de enige write die na die van 20 kan optreden is die van 10.
[
Voor 8% gewijzigd door
.oisyn op 13-09-2006 17:21
]