zoukankan      html  css  js  c++  java
  • 37.并行计算汇总

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <iostream>
     3 #include <thread>
     4 #include <future>
     5 #include <vector>
     6 #include <cstdlib>
     7 #include <mutex>
     8 using namespace std;
     9 #define COUNT 1000000
    10 
    11 //创建互斥量
    12 mutex m;
    13 
    14 //多线程计算加法
    15 int add(vector<int> *arr,int start,int count)
    16 {
    17     static mutex m;//只会初始化一次
    18     int sum(0);//保存结果
    19     for (int i = 0; i < count; i++)
    20     {
    21         sum += (*arr)[start + i];
    22     }
    23     {
    24         //锁定,离开作用区域,自动释放
    25         lock_guard<mutex> lckg(m);
    26         cout << "thread=" << this_thread::get_id()
    27             << ",count=" << count
    28             << ",sum=" << sum << endl;
    29     }
    30     return sum;
    31 }
    32 
    33 void main()
    34 {
    35     vector <int>data(COUNT);//数组,100万个数据
    36     for (int i = 0; i < COUNT; i++)
    37     {
    38         data[i] = (i + 1) % 1000;// 赋值初始化
    39     }
    40 
    41     vector<future<int>> result;//结果数组,存放结果
    42 
    43     int cpus = thread::hardware_concurrency();//CPU核心的个数
    44 
    45     for (int i = 0; i < cpus * 2; i++)
    46     {
    47         int batch_each = COUNT / (cpus * 2);
    48         //最后一个线程所计算的个数
    49         if (i == (cpus * 2) - 1)
    50         {
    51             batch_each = COUNT - COUNT / (cpus * 2)*i;
    52         }
    53         //不断压入结果
    54         result.push_back(async(add, &data, i*batch_each, batch_each));
    55         //async直接返回future类型结果
    56     }
    57 
    58     //汇总
    59     int lastresult(0);
    60     for (int i = 0;i<result.size();i++)
    61     {
    62         lastresult += result[i].get();//汇总结果
    63     }
    64     cout << "结果=" << lastresult << endl;
    65     
    66     cin.get();
    67 }
  • 相关阅读:
    Gvim快捷键学习
    一步一步学习Vim 全图解释
    经典vim插件功能说明、安装方法和使用方法介绍
    中国数学数字图书馆
    RQNOJ第一题---PID1 / 明明的随机数
    gdb常用命令
    linux c下mysql编程样例
    linux c编程 -- 线程互斥
    linux c多线程编程范例
    数据结构 -- 可重用模块的接口设计模板
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8549510.html
Copyright © 2011-2022 走看看