Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多线程C++;未使用vector并行运行的程序<;螺纹>;and.join()_C++_Multithreading_Concurrency_Parallel Processing_Thread Synchronization - Fatal编程技术网

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;