В каких обстоятельствах небезопасно иметь два разных потока, одновременно записывающих соседние элементы одного массива на x86? Я понимаю, что на некоторых DS9K-подобных архитектурах с безумными моделями памяти это может привести к разрыву слова, но на x86 однобайты адресуются. Например, на языке программирования D real
есть 80-разрядный тип с плавающей точкой на 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.
}
Примечание. Я знаю, что даже если это безопасно, это может иногда приводить к ложным проблемам с кэшем, что приводит к низкой производительности. Однако для случаев использования я имею в виду, что записи будут нечастыми, чтобы это не имело значения на практике.
Изменить: не беспокоиться о том, чтобы прочитать записанные значения. Предполагается, что синхронизация будет до считывания любых значений. Таким образом, я забочусь о безопасности записи.