我有一个通过随机样本计算游戏结果的程序;它传递了多次迭代,运行一个大小的循环,将结果存储在局部变量(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);
});
..它似乎完美地工作(所有结果都足够接近统计预期值)。我不禁想到有什么不对劲,因为在用局部变量的内容更新它时,我没有特别“锁定”类级变量,并且我通过纯粹的好运获得了正确的结果。
我有什么遗失的吗?
答案 0 :(得分:1)
你很幸运。您应该有一个专用(串行)队列来更新共享状态,或者使用OSAtomicAddSize添加它。如果没有这个,你偶尔会丢失更新。