![](/img/trans.png)
[英]crashing app when using std::vector in multithreaded C++ program
[英]Multithreaded C++ Program Not Running In Parallel Using vector<thread> and .join()
注意:这是我在此站点上发表的第一篇文章,但是我进行了广泛搜索,但未能找到解决问题的方法。 我编写了一个程序,该程序实际上测试了数字向量的所有排列,以找到我定义的最佳序列。 当然,即使对于较小的输入,计算数字排列也是非常耗时的,因此我试图通过使用多线程来加快处理速度。
这是一个复制该问题的小样本:
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();
}
}
我以为这可以使所有线程并行运行,但是我可以看到在Visual Studio和Windows Task Manager的高级设置中使用性能分析器,一次只能运行一个线程。 在可以访问4个线程的系统上,CPU的限制为25%。 我每次运行都会得到正确的输出,因此算法逻辑没有问题。 工作尽可能均匀地分布在所有任务对象中。 与共享数据的冲突很少发生。 使用线程池的程序实现总是以接近100%的速度运行。
提交给线程的对象不会打印到cout,并且所有对象都具有执行其工作所需的数据副本,除了一个共享对象外,它们均由指针引用。
private:
Solution* bestSolution;
由于我使用互斥锁中的lock_guard来使共享数据不受数据争用条件的影响,因此一次只能有一个线程更新bestSolution。
换句话说,为什么我的多线程程序的CPU运行率接近100%,而该线程使用的线程数与系统可用线程数一样多?
如果需要,我可以随时用更多信息更新此帖子。
在调试应用程序时,使用调试器“破坏所有”线程。 然后使用调试线程窗口检查每个线程,以查看每个线程在哪里执行。 您可能会发现只有一个线程正在执行代码,而其余所有线程都被一个正在运行的线程持有的互斥对象阻塞。
如果显示代码的更完整示例,则可以提供很大帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.