Я нашел несколько вопросов по этой же теме, но связанные с общими переменными (значениями и ссылочными типами) В принятом ответе этот вопрос говорится:
Раздел I, раздел 12.6.6 спецификации CLI гласит: "Соответствующий CLI должен гарантировать, что доступ для чтения и записи к правильно выровненным ячейкам памяти не больше, чем собственный размер слова, является атомарным, когда все обращения к записи в местоположение того же размера."
Ссылочные переменные (то есть классы) являются указателями, равными размеру родного слова, но у меня есть пара сомнений:
Гарантируются ли ссылки в правильно выровненных ячейках памяти?
Я не понимаю последнюю часть. Что это значит? "... когда все обращения к записи в местоположении имеют одинаковый размер".
Короче говоря, гарантирован ли obj2 быть допустимым на каждой итерации цикла в следующем коде?
class MyClass
{
private OtherClass m_Object;
void Thread1()
{
while(true)
{
OtherClass obj1 = new OtherClass();
m_Object = obj1;
}
}
void Thread2()
{
while (true)
{
OtherClass obj2 = m_Object;
// Is obj2 guaranteed to be valid?
obj2.Check();
}
}
}