Когато напиша стойност в поле, какви гаранции получавам относно това кога новата стойност ще бъде запазена в основната памет? Например, как да разбера, че процесорът не запазва новата стойност в личния си кеш, а е актуализирал основната памет?
Друг пример:
int m_foo;
void Read() // executed by thread X (on processor #0)
{
Console.Write(m_foo);
}
void Write() // executed by thread Y (on processor #1)
{
m_foo = 1;
}
Има ли възможност след приключване на изпълнението на Write(), друга нишка да изпълни Read(), но всъщност ще види "0" като текуща стойност? (тъй като може би предишното записване в m_foo все още не е било прочистено?).
Какъв вид примитиви (освен брави) са налични, за да се гарантира, че записите са били прочистени?
РЕДАКТИРАНЕ
В примерния код, който използвах, записът и четенето са поставени при различен метод. Thread.MemoryBarrier не засяга ли само пренареждането на инструкции, които съществуват в същия обхват?
Освен това, нека приемем, че те няма да бъдат вградени от JIT, как мога да се уверя, че стойността, записана в m_foo, няма да се съхранява в регистър, а в основната памет? (или когато m_foo се чете, няма да получи стара стойност от кеша на процесора).
Възможно ли е да се постигне това без използване на ключалки или ключовата дума „volatile“? (да речем също, че не използвам примитивни типове, а структури с размер WORD [така че volatile не може да се прилага].)
uint
и можете да приложитеvolatile
или всяка друга техника, обсъждана в различните отговори. - person Abel   schedule 14.11.2009