多线程编程速度较慢

Program slower with multi-threads

我开始学习多线程编程,并且有程序。我的程序使用多线程时速度较慢: 多线程:~ 8.5 秒 没有多线程:~ 4.96 有人可以解释我的代码有什么问题吗?

#include <iostream>
#include <thread>
#include <ctime>
using namespace std;
long long even_sum = 0;
long long odd_sum = 0;
void findEvenNumber(int start, int end){
    for(int i=start;i<end;i++){
        if(i%2==0){
            even_sum++;
        }
    }
}
void findOddNumber(int start, int end){
    for(int i=start;i<end;i++){
        if(i%2==1){
            odd_sum++;
        }
    }
}
void multiTask(){
    thread t1(findEvenNumber,1,1000000000);
    thread t2(findOddNumber,1,1000000000);
    t1.join();
    t2.join();
}
void noMultiTask(){
    findEvenNumber(1,1000000000);
    findOddNumber(1,1000000000);
}
int main(){
    clock_t start = clock();
    //noMultiTask();
    //multiTask();
    clock_t end = clock();
    cout<<(double)(end - start)/CLOCKS_PER_SEC<<endl;


    cout<<even_sum<<" "<<odd_sum<<endl;
    return 0;
}

multi-threaded 版本必须启动线程并等待它们完成。非 multi-threaded 版本没有。因此,multi-threaded 版本需要更多 CPU 时间是有道理的。

multi-threaded 版本确实花费更少的时间。

至少,你有一个错误的共享问题。 even_countodd_count 几乎肯定在同一个缓存行上,这意味着当您想要访问一个变量时,您实际上是在强制另一个线程使其缓存行无效。虚假分享的内容远不止于此,但为了快速概览,Scott Meyers 的精彩演讲一开始就提到了这一点:https://www.youtube.com/watch?v=WDIkqP4JbkE

通过使用局部变量进行 odd/even 计数并仅在线程末尾更新全局变量,我的系统性能得到了更好的提升(1.23299 秒对 1.07338 秒)。

void findEvenNumber(int start, int end){
    auto count = 0;
    for(int i=start;i<end;i++){
        if(i%2==0){
            count++;
        }
    }
    even_sum += count;
}
void findOddNumber(int start, int end){
    auto count = 0;
    for(int i=start;i<end;i++){
        if(i%2==1){
            count++;
        }
    }
    odd_sum += count;