C++ 多线程处理求和问题

C++ 11 的新标准支持了被封装的多线程库,虽然已经学过了C++ 的,但是今天想到用多线程处理一下求和的问题。
OK现在就直接先把代码贴出来吧
PS:由于每个人的电脑的CPU核数都不同,我的电脑就是一台很烂的笔记本(双核,除了打代码和扫雷没什么其他东西),众所周知,并行的时候如果线程超过cores会引起频繁的上下文切换,这样反而会降低性能,所以最好不要用超过你cores数目的线程去做计算量密集的处理
PS2: std::thread::hardware_concurrency() 可以返回你的CPU核数,在C++库不能返回CPU信息下可能返回0

#include
#include
#include
#include
#include
#include
using namespace std;


vector<int> vec;


struct accumulate_block{
    void operator () (vector<int>::iterator first, vector<int>::iterator last,int &result){
        result = std::accumulate(first, last, result);
    }
};


int multithreadSort(int init){
    const long length = distance(vec.begin(),vec.end());
    if (length == 0){
        return init;
    }
    unsigned long const min_per_thread = 25;//每个线程的子序列大小  
    unsigned long const max_threads = (length + min_per_thread - 1) / min_per_thread;//计算线程数(向上取整)  
    unsigned long const hardware_threads = thread::hardware_concurrency();//获取PC的CPU core数目,C++库可能无法访问该信息,所以可能返回0  
    unsigned long const num_threads = min(hardware_threads != 0 ? hardware_threads : 2, max_threads);//最大线程数为最大线程数和硬件core数目中取较小者(线程数超过core数目反而降低性能)  
    unsigned long const block_size = length / num_threads;//重新计算每个线程需要执行的序列大小  
    vector threads(num_threads - 1);
    vector<int> results(num_threads);//每个线程的结果将保存在results中  
    vector<int>::iterator block_start = vec.begin();
    for (int i = 0; i < (num_threads - 1); i++){//这里只分配子线程的任务序列,主线程也会执行一个排序任务
        auto block_end = block_start;
        advance(block_end, block_size);
        threads[i] = thread(accumulate_block(), block_start, block_end, std::ref(results[i]));//每个子线程的子序列分配  
        block_start = block_end;//更新序列位置  
    }
    accumulate_block mainAccu;
    mainAccu(block_start, vec.end(), results[num_threads - 1]);
    std::for_each(threads.begin(), threads.end(), std::mem_fn(&thread::join));//等待子线程完成  
    return std::accumulate(results.begin(), results.end(), init);

}
int main(){

    for (int i = 0; i < 100; i++){
        vec.push_back(i);
    }
    int sum = multithreadSort(50);
    cout << "Sum is : " << sum << endl;
    system("pause");
    return 0;
}

程序输出:

Sum is 5000

你可能感兴趣的:(C++)