2011-08-14 15 views
0

私はランダムサンプルでゲームの結果を計算する手続きを持っています。それは多くの反復を渡され、ローカル変数(subHits)に結果を格納するそのサイズのループを実行し、ループが完了した後、ローカル変数からの合計をクラスレベルメンバ変数(m_Hits)に追加します。ウィット:Grand Central Dispatchを正しく使用していますか?

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

あなたは幸運になります。共有状態を更新する専用(シリアル)キューを持つか、またはOSAtomicAddSizeを使用して追加します。これがなければ時々更新が失われます。

+0

これは少し新しくて(分かりますが)、共有状態を更新するためにシリアルキューを実装するにはどうすればいいですか? – Charles

+1

'dispatch_queue_t mHitsGuard = dispatch_queue_create(" com.myapp.mHitsUpdateQueue "、0); ... dispatch_async(mHitsGuard、^ {(I = 0 int型用 、iが11 <; ++ i)が{ m_Hits [I] + = subHits [I]; } }明らか ' –

+0

I < –

関連する問題