【问题标题】:Multithreading does not change speed多线程不会改变速度
【发布时间】:2015-05-12 16:52:01
【问题描述】:

我目前正在加速我的一个 c++ 程序,并试图发现多线程的美丽世界。

std::vector<std::thread> threadPool;
threadPool.clear();
for(int t = 0; t < nbThreads; ++t){
    threadPool.push_back(std::thread(myFunction, std::ref(rep), std::ref(branch1));
}
for(auto t = threadPool.begin(); t < threadPool.end() ; ++t){
    t->join();
}

我不明白的是,无论我使用多少线程,速度都不会改变! (大约 30 秒)。

总结一下:如果我的代码错了,有什么问题?如果没有错,在什么情况下应该使用多线程来加速计算?

编辑:我在 i7-4810MQ 机器上运行

编辑 2: 这是 myFunction 的作用(它解析 xml 文件)

void myfunction(DIR*& rep, struct dirent*& branch1){
mtx.lock();
while ((branch1 = readdir(rep)) != NULL){
    mtx.unlock()

    TiXmlDocument doc(branch1->d_name);
    if(doc.LoadFile()){
            //parse file
    }

    mtx.lock();
}
mtx.unlock();
}

【问题讨论】:

  • 是的。不。不。不。是的。
  • 你没有展示你是如何在你的线程之间细分你的工作,以及它们如何相互交流它们的依赖结果(如果有的话)。
  • 没有myFunction的实现,很难说。
  • 多线程并不意味着你的代码会运行得更快。更有可能的是,它会运行得更慢。除非您有多核处理器,否则处理器时间将在每个线程之间分配,加上创建它们和在它们之间切换的开销。
  • 如果myFunction(myArgument)执行需要30秒,并且你将它完全一样地传递给每个线程,那么不管是一千个线程执行,它仍然需要30秒每个线程来完成它的工作。您需要在线程之间拆分工作,并围绕它设计myFunction() 的实现。

标签: c++ multithreading


【解决方案1】:

您的代码很有可能受到文件 I/O 的限制。您的 XML 解析器也很有可能进行大量内存分配,如果许多线程同时分配内存,内存分配可能会减慢。

【讨论】:

  • 有没有办法检查它是否真的同时发生或进程是否按顺序进行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多