使用dispatch_apply的C ++ 11应用程序无法在Mac OS Sierra下运行

时间:2016-10-03 16:23:18

标签: c++11 grand-central-dispatch macos-sierra

我有一个用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 ++方法,那么我全都听见了。

1 个答案:

答案 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);
//                            ^~~~~~~~~~~                                         ^~~~~~