Нам говорят, что Volatile.Read над Thread.VolatileRead в большинстве случаев из-за того, что последний испускает полный забор, а первый испускает только соответствующую половину ограждения (например, приобретает забор); который более эффективен.
Однако, по моему мнению, Thread.VolatileRead
фактически предлагает что-то, что Volatile.Read
не делает, из-за реализации Thread.VolatileRead
:
public static int VolatileRead(ref int address) {
int num = address;
Thread.MemoryBarrier();
return num;
}
Из-за полного барьера памяти во второй строке реализации, я считаю, что VolatileRead
фактически гарантирует, что значение, которое было записано последним на address
, будет считано.
Согласно Wikipedia, "Полный забор гарантирует, что все операции загрузки и хранения до забора будут зафиксированы до любых нагрузок и хранилищ выпущенный после ограждения".
Правильно ли я понимаю? И поэтому, Thread.VolatileRead
все еще предлагает что-то, что Volatile.Read
не делает?