Доступ к членам объекта и атомарности - PullRequest
3 голосов
/ 13 ноября 2009
  • Из спецификации C # мы знаем, что чтение / запись ссылок являются атомарными. В операторе, который обращается к члену объекта, ссылка также будет доступна атомарно? Я думаю, да, потому что это также своего рода неявное чтение ссылок, для которого компилятор должен обеспечивать атомарность при генерации кода для него.

  • В том же операторе доступ к объекту для доступа к его члену приведет к тому, что ссылка на объекты будет храниться, чтобы не было мусора, когда новый экземпляр создается другим потоком?

  • Итак, если мы получим доступ к членам в цепочке, будет ли сохранена ссылка на самые левые объекты, чтобы она не собиралась мусором другими потоками?

Рассмотрим следующий код;

static SomeClass sharedVar;

void someMethod()
{
    SomeClass someLocalVar = sharedVar.memberX.memberY.a;
    operations on someLocalVar...
}

Я ищу официальное объяснение по этому вопросу из библиотеки MSDN , C # specs и т. Д. Или сотрудников Microsoft, чтобы убедиться, что я что-то не нарушаю и все в порядке.

Ответы [ 2 ]

3 голосов
/ 13 ноября 2009
  1. Да, все справочные чтения являются атомарными.
  2. Во время операции чтения поля невозможно получить ссылку с момента помещения значения в стек до тех пор, пока команда .ldfld не будет выполнена. В противном случае это позволило бы CLR собирать объект, который вы использовали. Наличие другого потока для создания экземпляра значения не связано с этой проблемой.
  3. Я не совсем уверен, что вы имеете в виду под этим последним пунктом, но я думаю, что вы слишком беспокоитесь о сборке мусора. CLR не удалит объект, пока вы все еще используете его.
0 голосов
/ 13 ноября 2009

Вы слишком беспокоитесь о GC. Он не удалит какой-либо объект, на который вы сможете ссылаться и получить к нему доступ в какой-то момент в будущем. Будут удалены только те объекты, которые полностью недоступны.

...