Memory fence
Een instructie die beperkt hoe geheugenbewerkingen eromheen mogen worden verschoven. Nodig omdat zowel de compiler als de processor achter je rug om herordenen.
De herordening is onzichtbaar in code met één thread — de uitkomst is hetzelfde — en rampzalig in code met meerdere threads. De klassieke bug is het publiceren van een verwijzing naar een object voordat de velden van het object zichtbaar zijn geworden voor een andere kern, die dan onzin leest uit een object dat vanuit zijn gezichtspunt nooit is geïnitialiseerd. Fences bestaan in varianten die passen bij de geheugenordeningen: een acquire-fence voorkomt dat latere leesacties naar voren schuiven, een release-fence voorkomt dat eerdere schrijfacties naar achteren schuiven, en een volledige fence stopt alles. Twee dingen verrassen mensen. Herordening door de compiler en door de hardware zijn aparte problemen die allebei moeten worden afgehandeld, daarom is volatile geen hulpmiddel voor threading. En door de sterke ordening van x86 werkt onjuiste code daar vaak wel en breekt ze op ARM.