我有一个用C ++ 11编写的功能完备的代码库,它使用Grand Central Dispatch并行处理,特别是 dispatch_apply 为一些简单的游戏计算做基本的并行for循环。
自升级到Sierra以来,此代码仍然运行,但每个块都是串行运行的 - 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 ++方法,那么我全都听见了。
答案 0 :(得分:2)
我不确定它是否是Sierra的错误。但是,如果将全局并发队列显式关联为目标,它似乎有效:
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);
// ^~~~~~~~~~~ ^~~~~~