2011-08-14 4 views
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]; 
    } 
} 

.. 물론, 내가 함께 호출 병렬 절차를 실행의 목적을 위해 임시 저장소로 로컬 변수를 사용

완벽하게 (모든 결과는 통계적으로 기대되는 값에 충분히 가깝습니다). 지역 변수의 내용을 업데이트 할 때 클래스 수준 변수를 구체적으로 '고정'할 필요가 없기 때문에 아무런 문제가 없다고 생각할 수는 없습니다. 그런데 저는 깎아 지른 행운을 빌어 올바른 결과를 얻고 있습니다.

내가 누락 된 자료가 있습니까?

답변

1

운이 좋아 지네. 공유 상태를 업데이트하기위한 전용 (직렬) 큐가 있거나 OSAtomicAddSize를 사용하여 큐에 추가해야합니다. 이 기능이 없으면 때때로 업데이트가 손실됩니다.

+0

나는 (당신이 말할 수 있듯이) 약간 새로운 것이므로, 공유 대기열을 업데이트하기 위해 직렬 대기열을 구현하는 방법은 무엇입니까? – Charles

+1

'dispatch_queue_t mHitsGuard = dispatch_queue_create ("com.myapp.mHitsUpdateQueue", 0); ... dispatch_async (mHitsGuard는^{내가 11 <; 를 위해 (ⅰ = 0 값 int ++ I) { m_Hits [I] + = subHits [I] } }' –

+0

명백하게 I이 GCD 잘 알아낼 수 있지만 내 인생에 대한 스택 오버플로 주석 서식을 작동하는 방법을 기억할 수 없습니다.. < –

관련 문제