一、多核时代

随着数字IC工艺的提升,单核性能越来越高,但随之来的是功率密度增大,芯片发热严重,要进一步提升性能,很自然会想到C多核。将计算任务分配到不同的cpu,最后将结果整合,完成多核并行。

二、C\C++的多线程

C提供了很方便的多线程库,最基本的是pthread库,C++里有thread库(调用起来更加方便),还有omp库(不必自己设置线程,已封装好),接下来将介绍C++pthread库的应用实例,这些实例能够很方便移植到不同的应用中。omp库的实例可参看C++openmp并行计算实例。

三、实例

pthread的实例参考了B站up主“正月点灯”的教学视频,讲得非常通俗易懂。

假设我们有一个数组arr[],长度为1亿,元素大小为0~4的随机数,我们需要计算它的和。

为此我们可以用两个线程,一个线程计算前5千万个元素之和,另一个线程计算后5千万个元素之和,最后两种相加。

顺便比较单线程的耗时,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <omp.h>
#define MAX_SIZE 100000000
int* arr;
// 定义数据结构,用来传递参数
typedef struct{int first;int last;int result;
}MY_ARGS;
//定义函数,给多线程调用
void* myfunc(void* args){int i;int s=0;MY_ARGS* my_args = (MY_ARGS*) args;int first = my_args->first;int last =  my_args->last;for(i=first;i<last;i++){s=s+arr[i];}my_args -> result = s;return  NULL;
}int main(){pthread_t th1;pthread_t th2;int i;arr = malloc(sizeof(int) * MAX_SIZE);int mid = MAX_SIZE/2;for(i=0;i<MAX_SIZE;i++){arr[i]=rand()%5;}MY_ARGS args1 = {0,mid,0};MY_ARGS args2 = {mid,MAX_SIZE,0};//1.pthread running time clock_t start,end;start = clock();pthread_create(&th1,NULL,myfunc,&args1);pthread_create(&th2,NULL,myfunc,&args2);pthread_join(th1,NULL);pthread_join(th2,NULL);int s = args1.result+args2.result;end = clock();printf("s  = %d\n",s);printf("thread2 time : %ld\n",end-start);// 2.single running timestart = clock();s = 0;for(i=0;i<MAX_SIZE;i++){s = s+ arr[i];}end = clock(); printf("s  = %d\n",s);printf("single time:  %ld\n",end-start);// 3.omp running timestart = clock();s = 0;omp_set_num_threads(2);#pragma omp parallel {#pragma omp for reduction(+:s)for(i=0;i<MAX_SIZE;i++){s = s+ arr[i];}}end = clock(); printf("s  = %d\n",s);printf("omp time:  %ld\n",end-start);return 0;}

代码比较了pthread2线程,单线程,omp2线程的结果:

可见两个线程,甚至还有可能变慢,可能的原因是这里的数据连续分布,gcc的优化已经很极致。如果两个任务比较独立,并行的效果会更明显。这里只是给个pthread应用的实例。

原文C++多线程——pthread

C++多线程1——pthread相关推荐

  1. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

  2. PHP多线程(Pthread初探)

    饿了,没有力气写代码了.马上五一来临.学一下多线程.pthread扩展的安装,就不说了. <?php $thread = new class extends Thread {public fun ...

  3. linux 多线程 semaphore ,Linux下多线程编程-Pthread和Semaphore使用.doc

    比锄戴垒丛共麦溺庄哆氏葫季袒飞闲棉铆稼椰悲倘寓矩案铺汞嫡懂伸腑箩五穗颗撩护尚巷苯宅瑚铱焕涅职枝怎摔什街杠写冻泡峡蠢舀以咽铝皇篮糠村墟凤帜攒摧定畜遁陛葛杯复妄婚赣续踌肖祷就抖帘荒徘魂圭焙酸劈待钞林讯啊铂 ...

  4. go和java线程,Go的多线程和pthread或Java线程有什么区别?

    正如之前的答案所述,go例程并不一定与系统线程相对应,但是如果你现在必须提高多线程的性能,我发现以下内容很有用: The current implementation of the Go runtim ...

  5. DPDK多线程:EAL pthread和lcore Affinity(F-Stack配置文件的配置参数:lcore_mask、lcore_list)

    目录 多线程 EAL pthread和lcore Affinity 非EAL pthread支持 公共线程API 控制线程API 已知的问题 cgroup控件 多线程 DPDK通常每个内核固定一个pt ...

  6. C语言中pthread或Windows API在多线程编程中的基本应用

    文章目录 多线程概述 掌握多线程需要学习什么? 使用pthread.h实现多线程 使用Windows API实现多线程 使用threads.h实现多线程 参考资料 警告 由于我懒得写完,而且懂的也不是 ...

  7. cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题

    cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作放到了主线程中,游戏的界面就会卡,这是不能容忍的,游戏最基本的条件就是流畅性,这就是为什么游戏开发选择C++的原因. ...

  8. Linux多线程工作笔记0005---Linux多线程基础_创建线程pthread_create_线程等待_线程终止

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 https://www.freecplus.net/c893ece166b94df4b2e185f ...

  9. C++ 多线程的创建和使用

    最近使用C++11 的 std::thread比较多,这里开始好好地总结一下. 官方的参考文档:https://en.cppreference.com/w/cpp/thread/thread 大佬的博 ...

  10. c语言多线程(c语言编译器)

    c语言为什么叫C"语言? C语言是1972年由美国的DennisRitchie设计发明的,并首次在UNIX操作系统的DECPDP-11计算机上使用.它由早期的编程语言BCPL(BasicCo ...

最新文章

  1. apache mysql 添加到开机自动启动
  2. war包发布找不见路径 weblogic getResource 与getRealPath
  3. 一个人,开始变得优秀,就会渐渐地从这些圈子消失了
  4. gensim训练word2vec并使用PCA实现二维可视化
  5. 敏捷开发系列学习总结(13)——Spotify敏捷模式详解三部曲第一篇:研发团队
  6. 腾讯官方程序被报毒拦截?马化腾致歉
  7. 一学就会之ado.net(一)
  8. faster rcnn fpn_Faster-RCNN详解和torchvision源码解读(三):特征提取
  9. 将指定文件中的空格或换行删除(可选是否创建一个新文件)
  10. (递归)666:放苹果
  11. 分布式缓存Redis使用以及原理
  12. SQL 修改表字段失败 解决方法
  13. 谷歌或Edge浏览器在开始菜单页面不显示图标
  14. 论文笔记:SRF(stereo radiance fileds)
  15. 基于ACCESS的教师工作量计算系统的设计与实现(含源文件)
  16. linux 命令:who 详解
  17. FPGA入门到实战-学习笔记
  18. 《棒球殿堂》:棒球联盟LEAGUE·千叶罗德海洋
  19. 雷霆行动(STG飞机游戏)源码分析
  20. sockboom群_Phonics:自然拼读自然拼读练习表

热门文章

  1. Mac系统安装Photoshop CS6教程
  2. 按Volume Down进Factory Mode的修改:
  3. 百度搜索引擎工作原理
  4. Tags From Sina Micro-Blog
  5. 如何解决速达软件出现主键、单号、编码相同的报错
  6. android录音工具,推荐四款十分好用的安卓录音应用
  7. 凝胶渗透色谱的基本概念(二)
  8. [Linux command]批处理注释
  9. 看漫画来告诉你:什么是 “元宇宙” ?
  10. 完全查杀VIKING(威金蠕虫)病毒与免疫补丁