繁体   English   中英

多线程C ++程序未使用向量并行运行 <thread> 和.join()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM