У меня есть процедура, которая вычисляет результат игры по случайной выборке;он проходит несколько итераций, запускает цикл такого размера, сохраняя результаты в локальной переменной (subHits), затем, после завершения цикла, добавляет итоги из локальных переменных в переменную-член уровня класса (m_Hits), чтобыwit:
void Game::LogOutcomes(long periodSize) {
int subHits[11];
for (int i = 0; i < 11; ++i) {
subHits[i] = 0;
}
for (int iters = 0; iters < periodSize; ++iters) {
// ... snipped out code calculating rankIndex by random sample.
++subHits[rankIndex];
}
for (int i = 0; i < 11; ++i) {
m_Hits[i] += subHits[i];
}
}
.. конечно, он использует локальную переменную в качестве временного хранилища для целей параллельного запуска процедуры, которую я вызываю с помощью:
dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(m_BatchSize / m_PeriodSize, globalQ, ^(size_t periodCount) {
LogBonusWager(m_PeriodSize);
});
.. икажется, что он работает идеально (все результаты достаточно близки к статистически ожидаемому значению).Я не могу не думать, что что-то не так, потому что нигде я специально не «блокирую» переменную уровня класса, когда обновляю ее содержимым локальной переменной, и что я получаю правильные результаты благодаря чистой удаче.
Есть ли что-то, чего мне не хватает?