Мне нужно посчитать, сколько раз '1' di git встречается в числах от 1 до N. Например, для 11 вывод равен 4, потому что 1 встречается один раз в "1", один раз в "10" и дважды в "11". Например, если мое N равно 1.000.000 (но большее N будет лучшим примером), и я дам ему 4 потока (я сначала дам одинаковое количество записей для каждого потока), мой первый поток вычислит числа от 1 до 250 000 но от 0 до 9 он делает одно вычисление, чтобы найти '1', из 10-99 он делает два вычисления, чтобы найти '1', из 100-999 он делает три, и так далее, поэтому первый поток завершится sh быстрее, чем другие (другие потоки будут иметь постоянное число вычислений 6 для каждой записи). Какую стратегию я могу применить к своей программе по порядку, чтобы каждый поток имел приблизительно одинаковое время выполнения, независимо от того, насколько велика N.
Это мой код распространения (тот, который назначает каждому потоку один и тот же номер записей), и я должен изменить его:
for(int i = 0; i < threads; i++){
if(i == 0)
info[i].from = 0;
else
info[i].from = info[i - 1].to + 1;
info[i].to = info[i].from + n / threads - 1;
if(i < n % threads)
info[i].to++;
pthread_create(&tid[i], NULL, thread_function, &info[i]);
}
'info' - это структура, которая содержит диапазон чисел, который должен вычислить каждый поток:
typedef struct {
int from;
int to;
} th_struct;