在iOS设备上执行并发任务时,如何设置适当的线程数? 我开发了一个跨平台的C++库,它在运行时生成线程。 我使用了一个并发队列来分派计算任务,因此每个线程在大多数时间都很忙

在iOS设备上执行并发任务时,如何设置适当的线程数? 我开发了一个跨平台的C++库,它在运行时生成线程。 我使用了一个并发队列来分派计算任务,因此每个线程在大多数时间都很忙,c++,ios,multithreading,concurrency,C++,Ios,Multithreading,Concurrency,现在的问题是如何在运行时获得适当数量的线程。由于我的任务没有I/O或网络操作,只有计算和堆内存分配,因此最好的策略是每个CPU核心生成线程: 我的代码如下所示: #include "concurrentqueue.h" #include <algorithm> #include <thread> #include <vector> #include <iostream> #include <mutex> std::mutex io_m

现在的问题是如何在运行时获得适当数量的线程。由于我的任务没有I/O或网络操作,只有计算和堆内存分配,因此最好的策略是每个CPU核心生成线程:

我的代码如下所示:

#include "concurrentqueue.h"
#include <algorithm>
#include <thread>
#include <vector>
#include <iostream>
#include <mutex>

std::mutex io_m;

struct Task {
    int n;
};

void some_time_consuming_operations(Task &t) {
    std::vector<int> vec;
    for (int i = 0; i < t.n; ++i)
        vec.push_back(1);
    {
        std::lock_guard<std::mutex> g(io_m);
        std::cout << "thread " << std::this_thread::get_id() << " done, vec size:" << vec.size() << std::endl;
    }
}

int main() {
    // moodycamel's lockfree queue: https://github.com/cameron314/concurrentqueue
    moodycamel::ConcurrentQueue<Task> tasks;

    for (int i = 0; i < 100; ++i)
        tasks.enqueue(Task{(i % 5) * 1000000 + 1000000});

    // I left 2 threads for ui and other usages
    std::vector<std::thread> jobs(std::max((size_t)2, (size_t)std::thread::hardware_concurrency() - 2));

    std::cout << "thread num:" << jobs.size() << std::endl;

    for (auto &job : jobs) {
        job = std::thread([&tasks]() {
            Task task;
            while (tasks.try_dequeue(task))
                some_time_consuming_operations(task);
        });
    }

    for (auto &job : jobs)
        job.join();

    return 0;
}

#包括“concurrentqueue.h”
#包括A11/A12将同时使用所有六芯(我在测试期间保持充电)。我不知道为什么它比单线程模式慢

测试程序是由UE4构建的游戏应用程序。

四个较慢的内核比较快的内核慢得多。因此,如果您在一个快速内核上执行一个需要6秒的任务,并在每个内核上运行一秒钟的工作,那么两个快速内核将在一秒钟后完成,而四个慢速内核可能需要10秒

如果您使用GCD,iOS将在内核之间洗牌这六个线程,因此您可以获得高达2.4倍的速度。如果您的线程实现没有做到这一点,那么您正在放慢速度


解决方案:要么使用GCD(加速比为2.4),要么只使用两个线程(加速比为2.0)。那是在iphonexr上;您需要以某种方式找出快速内核的数量。

没有代码,很难判断。由于性能受硬件的影响,您可以在运行时让用户或应用程序的基准对其进行配置,并选择最佳解决方案。我添加了一些代码@MichaelChourdakis@Scheff很抱歉,由于某些原因,我无法将我的真实代码放在这里,但我已更正了一些错误,请查看我的更新。我创建了一个线程向量,大小为
std::max(2,std::hardware\u concurrency()-2)
我不能将我的真实代码放在这里,原因之一是它在SO中不受欢迎。相反,将您的问题复制到一个文档中。如果这对你自己发现错误都没有帮助,那么你可以在你的问题中发表一些东西。您可以使用在线编译器来实现这一点(正如我在上面所做的那样)。线程lambda中不应该有一个循环吗?“<代码>返回<代码> >如果<代码>任务>代码>空了?因为我正在开发C++中的跨平台库,所以似乎没有办法使用GCD。另外,它实际上与我在C++中使用的并发队列一样。