Search code examples
c++11grand-central-dispatchmacos-sierra

C++11 app that uses dispatch_apply not working under Mac OS Sierra


I had a completely functioning codebase written in C++11 that used Grand Central Dispatch parallel processing, specifically dispatch_apply to do the basic parallel for loop for some trivial game calculations.

Since upgrading to Sierra, this code still runs, but each block is run in serial -- the cout statement shows that they are being executed in serial order, and CPU usage graph shows no parallel working on.

Queue is defined as:

workQueue = dispatch_queue_create("workQueue", DISPATCH_QUEUE_CONCURRENT);

And the relevant program code is:

            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;
                }

I strongly suspect that this either a bug, but if this is GCD forcing me to use new C++ methods for this, I'm all ears.


Solution

  • I'm not sure if it is a bug in Sierra or not. But it seems to work if you explicitly associate a global concurrent queue as target:

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