2016-10-03 9 views
1

Grand Central Dispatchの並列処理を使用したC++ 11で書かれた完全に機能するコードベースがありました。具体的にはdispatch_apply些細なゲームの計算。Mac OSでdispatch_applyが動作しないC++ 11アプリケーション

シエラにアップグレードしているので、このコードはまだ実行されますが、各ブロックは、シリアルに実行される - COUTステートメントは、それらがシリアル順序で実行されていることを示しており、CPUの使用率グラフは作業全く平行を示しません。

キューは次のように定義されています

workQueue = dispatch_queue_create("workQueue", DISPATCH_QUEUE_CONCURRENT); 

、関連プログラムコードは次のとおりです。

  case Concurrency::Parallel: { 
        dispatch_apply(stateMap.size(), workQueue, ^(size_t stateIndex) { 
         string thisCode = stateCodes[stateIndex]; 
         long thisCount = stateCounts[stateIndex]; 

         GameResult sliceResult = playStateOfCode(thisCode, thisCount); 
         results[stateIndex] = sliceResult; 

         if ((stateIndex + 1) % updatePeriod == 0) { 
          cout << stateIndex << endl; 
         } 
        }); 
        break; 
       } 

私は強く、このどちらかのバグが、これはGCDである場合は、新しいCを使用するように私を強制することを疑う++このための方法は、私はすべての耳です。

答えて

2

シエラのバグかどうかはわかりません。しかし、グローバルな並行キューをターゲットとして明示的に関連付けるとうまくいくように見えます:

dispatch_queue_t target = 
     dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0); 
dispatch_queue_t workQueue = 
     dispatch_queue_create_with_target("workQueue", DISPATCH_QUEUE_CONCURRENT, target); 
//       ^~~~~~~~~~~           ^~~~~~ 
+0

これは問題を修正したようです。さて、Swift 3の* DispatchQueue.concurrentPerform(iterations:)*メソッドを使ってこの作業を行う方法を見つける必要があります。これはまだそのバグがあるようです。しかし、私は回避策に感謝! – Charles

+0

スウィフト3について十分に知っているとは思わないが、スウィフト並行性の方法で同様の回避策を活用する方法を提案するには http://stackoverflow.com/questions/39843007/swift-app-using- dispatchqueue-concurrentperformiterations-no-longer-runs-conc あなたの時間のおかげでいずれにせよ、間違いなく助けに感謝! – Charles

関連する問題