Является ли следующая конструкция поточно-ориентированной, если предположить, что элементы foo выровнены и имеют правильный размер, чтобы не было разрыва слова? Если нет, то почему нет?
Примечание: приведенный ниже код является игрушечным примером того, что я хочу сделать, а не моим реальным сценарием реального мира. Очевидно, в моем примере есть лучшие способы кодирования наблюдаемого поведения.
uint[] foo;
// Fill foo with data.
// In thread one:
for(uint i = 0; i < foo.length; i++) {
if(foo[i] < SOME_NUMBER) {
foo[i] = MAGIC_VAL;
}
}
// In thread two:
for(uint i = 0; i < foo.length; i++) {
if(foo[i] < SOME_OTHER_NUMBER) {
foo[i] = MAGIC_VAL;
}
}
На первый взгляд это выглядит небезопасно, поэтому я выделю, почему я думаю, что это может быть безопасно:
- Единственные две опции - чтобы элемент foo был неизменным или был установлен в MAGIC_VAL.
- Если поток два видит foo [i] в промежуточном состоянии во время его обновления, могут произойти только две вещи: промежуточное состояние <<code>SOME_OTHER_NUMBER или нет. Если это <<code>SOME_OTHER_NUMBER, второй поток также попытается установить его в MAGIC_VAL. Если нет, поток два ничего не будет делать.
Редактировать: Кроме того, что, если foo это long, double или что-то, так что обновление не может быть выполнено атомарно? Вы все еще можете предполагать, что выравнивание и т. Д. Таково, что обновление одного элемента foo не повлияет на любой другой элемент. Кроме того, весь смысл многопоточности в этом случае заключается в производительности, поэтому любой тип блокировки может победить это.