Я рассматриваю реализацию методов VolatileRead/VolatileWrite (используя Reflector), и я озадачен чем-то.
Это реализация для VolatileRead:
[MethodImpl(MethodImplOptions.NoInlining)]
public static int VolatileRead(ref int address)
{
int num = address;
MemoryBarrier();
return num;
}
Каким образом помещается барьер памяти после считывания значения "адрес"? разве это не должно быть наоборот? (место перед чтением значения, поэтому любые ожидающие записи в "адрес" будут завершены к моменту начала фактического чтения. То же самое происходит и с VolatileWrite, где барьер памяти помещается перед назначением значения. Почему это? Кроме того, почему эти методы имеют атрибут NoInlining? что может произойти, если они были вложены?