Правильно ли я использую Grand Central Dispatch? - PullRequest
0 голосов
/ 14 августа 2011

У меня есть процедура, которая вычисляет результат игры по случайной выборке;он проходит несколько итераций, запускает цикл такого размера, сохраняя результаты в локальной переменной (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);
});

.. икажется, что он работает идеально (все результаты достаточно близки к статистически ожидаемому значению).Я не могу не думать, что что-то не так, потому что нигде я специально не «блокирую» переменную уровня класса, когда обновляю ее содержимым локальной переменной, и что я получаю правильные результаты благодаря чистой удаче.

Есть ли что-то, чего мне не хватает?

1 Ответ

1 голос
/ 14 августа 2011

Тебе повезло. У вас должна быть выделенная (последовательная) очередь для обновления общего состояния, или используйте OSAtomicAddSize, чтобы добавить к нему. Без этого вы будете время от времени терять обновления.

...