Давайте напишем счетчик, значение которого мы хотим увеличивать из разных потоков, а после того как все потоки закончат работу, мы выводим это число.
public class Counter { public int value; public void Increment() => Interlocked.Increment(ref this.value); }
Вот вроде бы и все, но на самом деле - можно быстрее. Каким образом?
public class Counter { public int[] values; public int Count { get { var count = 0; for (int i = 0; i < this.values.Length; ++i) count += this.values[i]; return count; } } public void Increment(int threadIndex) => ++this.values[threadIndex]; }
Т.е. мы должны знать количество потоков и порядковый номер потока, в котором работаем (В Unity Jobs есть JobsUtility.ThreadIndex и JobsUtility.ThreadIndexCount).
Т.е. мы создаем Counter с массивом по количеству потоков и при каждой операции Increment мы передаем номер текущего потока. Тогда этот счетчик будет работать без оверхеда на добавление совсем. А когда операции закончились - мы суммируем все счетчики и возрващаем значение.