При каких обстоятельствах небезопасно иметь два разных потока одновременно для смежных элементов одного массива на x86? Я понимаю, что на некоторых DS9K-подобных архитектурах с безумными моделями памяти это может привести к разрыву слова, но на x86 однобайты адресуются. Например, на языке программирования D real
представляет собой 80-битный тип с плавающей точкой на x86. Будет ли это безопасно сделать что-то вроде:Word Tearing on x86
real[] nums = new real[4]; // Assume new returns a 16-byte aligned block.
foreach(i; 0..4) {
// Create a new thread and have it do stuff and
// write results to index i of nums.
}
Примечания: Я знаю, что, даже если это безопасно, он может иногда вызывать ложные проблемы обмена с кэшем, что приводит к снижению производительности. Тем не менее, для случаев использования я имею в виду, что записи будут нечастыми, так как это не имеет значения на практике.
Редактировать: Не беспокойтесь о том, чтобы прочитать записанные значения. Предполагается, что будет быть синхронизированным до считывания любых значений. Я забочусь только о безопасности , написав таким образом.
Я предполагаю, что вы смотрите на грязные записи о смежных адресах? – BCS