我注意到使用这个简单的例子多线程几乎总是需要更长的时间。我只是在我编写的代码中测试它。我在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;
}
答案 0 :(得分:2)
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实际上生成了这样的代码。在那种情况下,不幸的是,计算量与线程数成正比。
答案 1 :(得分:1)
您的代码太简单了,编译器可能会在单核运行中进行一些优化(如自动矢量化)。
创建新线程也是一种昂贵的操作,单线程甚至可以在创建线程之前完成。程序中的常见做法是创建一些线程池,然后使用此池中的线程。它们不需要再次分配,因此在运行时使用它们更快。但这并不适合这样一个简单的应用程序。