使用 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);
//                            ^~~~~~~~~~~                                         ^~~~~~