0
무작위 샘플로 게임 결과를 계산하는 절차가 있습니다. 그것은 많은 반복을 통과하고 결과를 로컬 변수 (subHits)에 저장하는 크기의 루프를 실행 한 다음 루프가 완료된 후 로컬 변수의 합계를 클래스 수준 멤버 변수 (m_Hits)에 추가합니다. 재치는 ..Grand Central Dispatch를 올바르게 사용하고 있습니까?
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);
});
작동하는 것 같다 :
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];
}
}
.. 물론, 내가 함께 호출 병렬 절차를 실행의 목적을 위해 임시 저장소로 로컬 변수를 사용
완벽하게 (모든 결과는 통계적으로 기대되는 값에 충분히 가깝습니다). 지역 변수의 내용을 업데이트 할 때 클래스 수준 변수를 구체적으로 '고정'할 필요가 없기 때문에 아무런 문제가 없다고 생각할 수는 없습니다. 그런데 저는 깎아 지른 행운을 빌어 올바른 결과를 얻고 있습니다.내가 누락 된 자료가 있습니까?
나는 (당신이 말할 수 있듯이) 약간 새로운 것이므로, 공유 대기열을 업데이트하기 위해 직렬 대기열을 구현하는 방법은 무엇입니까? – Charles
'dispatch_queue_t mHitsGuard = dispatch_queue_create ("com.myapp.mHitsUpdateQueue", 0); ... dispatch_async (mHitsGuard는^{내가 11 <; 를 위해 (ⅰ = 0 값 int ++ I) { m_Hits [I] + = subHits [I] } }' –
명백하게 I이 GCD 잘 알아낼 수 있지만 내 인생에 대한 스택 오버플로 주석 서식을 작동하는 방법을 기억할 수 없습니다.. < –