Общий ответ: вам нужен какой-то способ обеспечить / обеспечить необходимую атомарность, чтобы читатель не увидел противоречивое состояние.
Блокировка (выполненная правильно) достаточна, но не всегда необходима. Но чтобы доказать, что в этом нет необходимости, вам нужно что-то сказать об атомарности выполняемых операций.
Это касается как архитектуры целевого хоста, так и, в некоторой степени, компилятора.
В вашем примере вы записываете long в массив. В этом случае вопрос заключается в хранении длинного атома? Возможно, но это зависит от хоста. Возможно, что ЦП записывает часть длинных (верхние / нижние слова / байты) отдельно, и, таким образом, читатель может получить значение, которое никогда не записывается. (Я полагаю, что это маловероятно для большинства современных архитектур ЦП, но вам следует проверить это.)
Также возможна буферизация записи в CPU. Прошло много времени с тех пор, как я смотрел на это, но я считаю, что можно изменить порядок магазина, если у вас нет необходимых инструкций по защите от записи. Из вашего примера неясно, будете ли вы полагаться на это.
Наконец, вам, вероятно, нужно пометить массив как volatile
(опять же, я давно этого не делал, так что разбираюсь в особенностях), чтобы компилятор не делал предположения о том, что данные не меняются под ним.