c++ - 如何提高C++中的多线程性能

标签 c++ multithreading

这是我代码的主要部分,为了加快速度,我使用了如下所示的多线程,所以我的基本想法是简单地将它们分成 12 个部分,让它们分别完成工作

    int Thread_num=12;
    int firstone=0;
    int lastone=vector.size();
    int chunk = (lastone-firstone+(Thread_num-1))/Thread_num;
    std::thread t[Thread_num];       
   for(int i=0;i<Thread_num;i++)
{
  int s =firstone+i*chunk;
  int e = ((s+chunk)<vector.size())? (s+chunk) : vector.size();

  t[i]=std::thread(calculateAll,data,arr,s,e);         
}
for (int i = 0; i < Thread_num; ++i)
{
  t[i].join();
}

这里是 calculateAll 函数(不是确切的代码),我使用 lock 锁定 push_back 部分以避免它们同时写入该 list vector (顺序无关紧要)。

void calculateAll(int ***data,LineIndex* arr,int s,int e)
{
  for(int a=s;a<e;a++)
  {
    function_1(arr) /*do something with array(arr)*/
    result=function_2(data) /*do something with data*/
    mylock.lock();
    list.push_back(result);       
    mylock.unlock();
  }
}

那么理论上,会加速12倍吗?当我在我的代码中使用这个想法时,它的速度提高了 5 到 6 倍,这有意义吗?我可以修改一些东西以使性能更好,也许使用其他方法吗?赞赏

最佳答案

lock()unlock() 正在降低性能,将您的并行算法转变为或多或少的串行算法。正如其中一条评论所建议的那样,为每个线程提供自己的列表以存储其结果,并在所有线程完成后合并结果。

换一种说法,当您说您的服务器有 14 个内核时,那是实际的物理内核,还是 7 个内核,每个内核都有两个超线程?如果是后者,超线程会相互干扰,并且您无法获得从单独内核获得的全部加速。

关于c++ - 如何提高C++中的多线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41488325/

相关文章:

c# - C# 中的 BackgroundWorker2_RunWorkerCompleted 的无效跨线程操作

java - 同步中的等待和通知方法?

C++:为什么 VS2005 中的(模板)类中的运算符放置 new 不被识别为内联友元函数?

c++ - 为什么这个自定义类的声明是 Not Acceptable ?

c++ - 具有指向派生对象 : How to tell both of each other's existence? 的指针的基类

c++ - 如何转发声明从另一个类C++继承的类?

c++ - 模板参数排列顺序错误。这是对的吗?

c++ - 是否有可能杀死纺 yarn ?

java - 将任务划分为线程 - 多线程

java - 在以下情况下使用 isInterrupted 而不是 interrupted 会更好吗