2016-10-03 2 views
1

Grand Central Dispatch 병렬 처리를 사용하는 C++ 11로 작성된 코드베이스가 있습니다. 특히 dispatch_apply 기본 병렬 for for some을 수행했습니다. 사소한 게임 계산. 시에라로 업그레이드 한 이후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

Swift 3에 대해 충분히 알고 있다고 생각하지 않으므로 Swift 동시성 메서드에 대해 비슷한 해결 방법을 활용하는 방법을 제안하지 마십시오. http://stackoverflow.com/questions/39843007/swift-app-using- dispatchqueue-concurrentperformiterators-no-longer-runs-conc 시간을내어 주셔서 감사합니다. 확실히 도움을 주셔서 감사합니다! – Charles