我最近又开始使用C ++并编写了一个简单的测试应用程序,它通过整数值矩阵找到最佳路径。为了提高这个应用程序的性能,我使用C ++ 11 std :: thread实现了多线程。
unsigned int threadCount = std::thread::hardware_concurrency();
std::vector<std::thread> threads;
for (unsigned int threadIndex = 0; threadIndex < threadCount; threadIndex++) {
threads.push_back(std::thread(&AltitudeMapPath::bestPath, this, threadCount, threadIndex));
}
for (auto& thread : threads) {
thread.join();
}
截至目前,我只是确定可用线程的总数并为每个线程执行我的测试。这很棒,但它让我思考......
尝试使用给定系统的所有可用线程是不好的做法吗?除了这个简单的例子之外,多线程的生产级应用程序试图尽可能多地获取线程(或者问题允许)或者我不应该这么贪婪吗?
谢谢,
答案 0 :(得分:6)
我认为没有一个正确的最佳做法,应用程序应使用多少核心取决于用户的偏好。在某些情况下,用户希望应用程序尽快运行,并且会出现用户更喜欢多任务并且没有应用程序陷入机器的情况。
我遇到了类似的问题,并决定使线程数可配置,以便用户可以在速度和CPU资源可用性之间进行选择。我可以想到至少有一个使用类似配置的应用程序,所以我不认为让用户选择是不常见的。
如果您被迫选择该用户,我建议使用硬件核心数量 - 1来释放一个线程供用户执行其他工作。
另请注意,std::thread::hardware_concurrency()
是一个提示,如果无法做出决定,则可以返回0.