我正确使用Grand Central Dispatch吗?

时间:2011-08-14 17:42:07

标签: c++ grand-central-dispatch

我有一个通过随机样本计算游戏结果的程序;它传递了多次迭代,运行一个大小的循环,将结果存储在局部变量(subHits)中,然后在循环完成后,将局部变量的总数添加到类级别成员变量(m_Hits)中,即:

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 个答案:

答案 0 :(得分:1)

你很幸运。您应该有一个专用(串行)队列来更新共享状态,或者使用OSAtomicAddSize添加它。如果没有这个,你偶尔会丢失更新。