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

人盡茶涼 提交于 2019-12-08 05:23:23

问题


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.


回答1:


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


来源:https://stackoverflow.com/questions/39836134/c11-app-that-uses-dispatch-apply-not-working-under-mac-os-sierra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!