在iOS设备上执行并发任务时,如何设置适当的线程数? 我开发了一个跨平台的C++库,它在运行时生成线程。 我使用了一个并发队列来分派计算任务,因此每个线程在大多数时间都很忙
现在的问题是如何在运行时获得适当数量的线程。由于我的任务没有I/O或网络操作,只有计算和堆内存分配,因此最好的策略是每个CPU核心生成线程: 我的代码如下所示:在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
#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++中使用的并发队列一样。