使用 dispatch_apply 的 C++11 应用程序无法在 Mac OS Sierra 下运行
C++11 app that uses dispatch_apply not working under Mac OS Sierra
我有一个用 C++11 编写的功能完备的代码库,它使用 Grand Central Dispatch 并行处理,特别是 dispatch_apply 来为一些人做基本的并行 for 循环琐碎的游戏计算。
自升级到 Sierra 后,这段代码仍然是 运行s,但是每个块都是 运行 串行的——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++ 方法,我洗耳恭听。
我不确定这是否是 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);
// ^~~~~~~~~~~ ^~~~~~
我有一个用 C++11 编写的功能完备的代码库,它使用 Grand Central Dispatch 并行处理,特别是 dispatch_apply 来为一些人做基本的并行 for 循环琐碎的游戏计算。
自升级到 Sierra 后,这段代码仍然是 运行s,但是每个块都是 运行 串行的——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++ 方法,我洗耳恭听。
我不确定这是否是 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);
// ^~~~~~~~~~~ ^~~~~~