C++ 为什么';多线程是否提供加速?

C++ 为什么';多线程是否提供加速?,c++,multithreading,C++,Multithreading,我注意到,使用这个简单的示例多线程几乎总是需要更长的时间。我只是在我编写的代码中进行测试。我在24核处理器上使用它。似乎使用2个线程效果最好,3个或更多线程比使用1个线程效果最差 #include <thread> #include <mutex> #include <condition_variable> #include <iostream> using namespace std; mutex total; mutex coutLock;

我注意到,使用这个简单的示例多线程几乎总是需要更长的时间。我只是在我编写的代码中进行测试。我在24核处理器上使用它。似乎使用2个线程效果最好,3个或更多线程比使用1个线程效果最差

#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
using namespace std;
mutex total;
mutex coutLock;

mutex order;
long long sum=1000000000;
long long mysum=0;

const int threads=3;
long long x;

void dowork(int x,int threads) {
    long long temp=0;
    for(long long i=x*sum/threads;i<((x+1)*sum/threads);i++) {
        temp+=i;
    }

    total.lock();
    mysum+=temp;
    total.unlock(); 
}

int main() {
    thread * pool[threads];
    for(x=0;x<threads;x++) {
        thread *mine=new thread(dowork,x,threads);
        pool[x]=mine;
    }

    for(x=0;x<threads;x++) {
        pool[x]->join();
    }

    cout<<"My sum is: "<<mysum<<endl;
}
#包括
#包括
#包括
#包括
使用名称空间std;
互斥总数;
互斥锁;
互斥顺序;
长和=100000000;
长糠=0;
常量int线程=3;
长x;
无效定位销(整数x,整数螺纹){
长期温度=0;

对于(long long i=x*sum/threads;i您的代码太简单了,编译器可能会在单核运行中进行一些优化(如自动矢量化)

创建新线程在某种程度上也是一个昂贵的操作,单线程甚至可以在创建线程之前完成。程序中的常见做法是创建一些线程池,然后使用该池中的线程。它们不需要再次分配,因此在运行时使用它们会更快。但这并不适用于这样的简单操作类似这样的应用程序。

可以将
dowork()
中的循环简化为O(1)代码,计算以下等式:

temp = (b - a + 1) * a + (b - a) * (b - a + 1) / 2
       where a = x * sum / threads, b = (x + 1) * sum / threads - 1

例如,clang++3.5.1实际上生成了这样的代码。不幸的是,在这种情况下,计算量与线程数成正比。

@user3869404在这种情况下不是。但在实际应用中是的。