Добавление (то есть +=
) не является и не может быть атомарной операцией (как вы знаете).К сожалению, нет способа достичь этого без применения полного ограждения, с другой стороны, они довольно оптимизированы на низком уровне.Тем не менее, есть несколько других способов обеспечения целостности (тем более, что это всего лишь добавление)
- Использование
Interlocked.Add
(Самое разумное решение) - Применение эксклюзивно
lock
(или Moniter.Enter
) вне цикла for. AutoResetEvent
, чтобы обеспечить выполнение потоков одной за другой (meh sigh ). - Создайте темп
int
в каждом потоке и после завершения добавьте темп к сумме в монопольном замке или подобном. - Использование
ReaderWriterLockSlim
. Parallel.For
накопление на основе потоков с суммой Interlocked.Increment
, равно 4.