Interlocked.Increment Метод с определенным интервалом - PullRequest
0 голосов
/ 18 февраля 2019

У нас есть параллельная многопоточная программа.Как бы я увеличил номер выборки на интервал +5 каждый раз?Имеет ли Interlocked.Increment перегрузку для интервала?Я не вижу его в списке.

Метод блокировки Microsoft.* C # Создание глобального номера, который увеличивается на 1

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Добавление (то есть +=) не является и не может быть атомарной операцией (как вы знаете).К сожалению, нет способа достичь этого без применения полного ограждения, с другой стороны, они довольно оптимизированы на низком уровне.Тем не менее, есть несколько других способов обеспечения целостности (тем более, что это всего лишь добавление)

  1. Использование Interlocked.Add (Самое разумное решение)
  2. Применение эксклюзивно lock (или Moniter.Enter) вне цикла for.
  3. AutoResetEvent, чтобы обеспечить выполнение потоков одной за другой (meh sigh ).
  4. Создайте темп int в каждом потоке и после завершения добавьте темп к сумме в монопольном замке или подобном.
  5. Использование ReaderWriterLockSlim.
  6. Parallel.For накопление на основе потоков с суммой Interlocked.Increment, равно 4.
0 голосов
/ 18 февраля 2019

Я думаю, вы хотите Interlocked.Add:

Добавляет два целых числа и заменяет первое целое число суммой в качестве атомарной операции.

int num = 0;
Interlocked.Add(ref num, 5);
Console.WriteLine(num);
...