Можно ли наблюдать частично сконструированный объект из другого потока, когда конструирующий поток выполняет запись и чтение? - PullRequest
2 голосов
/ 01 мая 2020

Существует по крайней мере один вопрос, похожий на этот вопрос, однако я считаю, что у меня есть различные ограничения ... Если у меня есть класс с некоторым количеством полей и объекты этого класса неизменны, будет ли это теоретически возможным (если предположить, что самый слабый разрешил модели памяти для CLR) наблюдать частично построенный объект, когда ссылка на объект является изменчивой, и поток, создающий объект, одновременно записывает и читает ссылку (записывает в первую очередь)?

Поправьте меня, если я неверно, но я понимаю модель памяти так, что если поток a создает объект класса X и записывает ссылку на некоторую разделяемую изменяемую переменную volatile, то конструирование объекта не может быть переупорядочено после назначения volatile. Если поток b читает ссылку и видит новое значение, можно с уверенностью предположить, что к объекту можно получить доступ, поскольку верно также и то, что операции, следующие за изменчивым чтением ссылки, не могут быть переупорядочены перед ним, поэтому, если thread2 видит запись он видит все, что было раньше. Это правда?

Если да, то изменится ли это, если поток сначала создает объект, а затем записывает переменную, а затем снова читает эту же переменную? у нас есть (в потоке a) конструкция объекта, затем volatile-запись с последующим volatile-чтением той же переменной (в порядке программы), что и c, дает правильное значение для потока a, но возможно ли для потока b каким-то образом увидеть эффекты прочитанного перед записью? Я знаю, что если освобождение произойдет до того, как приобретут, они могут быть юридически переупорядочены, но не уверен, правильно ли я понял смысл.

...