C++ 多线程C++;未使用vector并行运行的程序<;螺纹>;and.join()
注意:这是我在这个网站上发表的第一篇帖子,但我已经进行了大量搜索,未能找到解决问题的方法。 我写了一个程序,基本上测试了一个数字向量的所有排列,以找到我定义的最优序列。当然,即使对于较小的输入,计算数字的排列也是非常耗时的,所以我试图通过使用多线程来加快速度C++ 多线程C++;未使用vector并行运行的程序<;螺纹>;and.join(),c++,multithreading,concurrency,parallel-processing,thread-synchronization,C++,Multithreading,Concurrency,Parallel Processing,Thread Synchronization,注意:这是我在这个网站上发表的第一篇帖子,但我已经进行了大量搜索,未能找到解决问题的方法。 我写了一个程序,基本上测试了一个数字向量的所有排列,以找到我定义的最优序列。当然,即使对于较小的输入,计算数字的排列也是非常耗时的,所以我试图通过使用多线程来加快速度 下面是一个复制问题的小样本: class TaskObject { public: void operator()() { recursiveFunc(); } private: Solution
下面是一个复制问题的小样本:
class TaskObject {
public:
void operator()() {
recursiveFunc();
}
private:
Solution *bestSolution; //Shared by every TaskObject, but can only be accessed by one at a time
void recursiveFunc() {
if (base_case) {
//Only part where shared object is accessed
//base_case is rarely reached
return;
}
recursiveFunc();
}
};
void runSolutionWithThreads() {
vector<thread> threads(std::thread::hardware_concurrency());
vector<TaskObject> tasks_vector(std::thread::hardware_concurrency());
updateTasks(); //Sets parameters that intialize the first call to recursiveFunc
for (int q = 0; q < (int)tasks_vector.size(); ++q) {
threads[q] = std::thread(tasks_vector[q]);
}
for (int i = 0; i < (int)threads.size(); ++i) {
threads[i].join();
}
}
这个共享数据不受数据竞争条件的影响,因为我使用了互斥锁的lock_guard来实现它,所以一次只有一个线程可以更新bestSolution
换句话说,为什么我的多线程程序的CPU运行速度不接近100%,因为它使用的线程数量与系统中可用的线程数量一样多?
如果需要,我可以随时用更多信息更新这篇文章。在调试应用程序时,使用调试器“断开所有”线程。然后使用debug thread窗口检查每个线程,以查看每个线程的执行位置。您可能会发现,只有一个线程在执行代码,而其余的线程都在运行线程所持有的互斥锁上被阻塞
如果您展示一个更完整的代码示例,它将非常有帮助。您可能需要一个共享对象,并且您的共享对象看起来非常可疑,可能是一个数据race@PasserBy共享对象不应受到数据竞争条件的影响。代码尚未完成,经验法则是,有人应该能够复制粘贴某些内容并查看您的结果。这并不是说你应该把所有的东西都放在这里,这意味着你应该模拟
解决方案
和它的访问,以某种方式仍然可以复制问题。如果您后来意识到问题与解决方案
的工作方式有关,您可能已经解决了问题。我更新了帖子,注意到与共享数据的冲突很少发生。在调试器中,似乎所有线程都以大约相同的速度工作,但在我的4线程系统中,CPU在性能分析器中的利用率限制在25%。我知道这肯定是一个错误,因为当我使用线程池实现运行程序时,我发现程序几乎总是以100%的CPU利用率运行。
private:
Solution* bestSolution;