Меня интересует реализация общей памяти в С#. MemoryMappedViewAccessor позволяет считывать данные из общей области памяти.
Теперь memoryMappedViewAccessor наследуется от UnmanagedMemoryAccessor, который предоставляет доступ к таким методам, как ReadInt32(), реализацию которого можно увидеть здесь https://referencesource.microsoft.com/#mscorlib/system/io/unmanagedmemoryaccessor.cs,7632fe79d4a8ae4c . В принципе, похоже, используется относительно простая небезопасная арифметика/приведение указателей,
pointer += (_offset + position);
result = *((Int32*)(pointer));
Но .. (как) гарантируется, что ЦП не будет кэшировать это значение? Например, вы можете пометить переменные как «volatile», чтобы обеспечить такое поведение, но как это сделать в случае, как указано выше, когда данные считываются из памяти по указателю через небезопасный код. Будет ли это всегда рассматриваться как изменчивое чтение или оно не является изменчивым?
В случае последнего, не означает ли это, что данные в общей памяти могут не синхронизироваться в реализации Microsoft, например. внешний процесс очень часто переопределяет определенное место в памяти, и код С# очень часто читает это, рискуя тем, что значения будут кэшироваться ЦП вместо того, чтобы каждый раз заново считываться из памяти?
Спасибо