1 min read
25 Sep

Давайте напишем счетчик, значение которого мы хотим увеличивать из разных потоков, а после того как все потоки закончат работу, мы выводим это число.

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

Comments
* The email will not be published on the website.