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 мы передаем номер текущего потока. Тогда этот счетчик будет работать без оверхеда на добавление совсем. А когда операции закончились - мы суммируем все счетчики и возрващаем значение.#multithreading #threading #collections #lockfree