• c++11 多线程 1<<c++ concurrency in action>>


    一、并行、多线程

    1、计算机中的并行有两种方式:任务切换、利用多处理器多核。

    纯粹的任务切换:

     

    纯粹的多处理器多核:

     

    任务切换与多处理器多核结合:

     

    实际应用中是“任务切换与多处理器多核结合”方式,首先现在硬件偏移单处理器单核淘汰“纯粹的任务切换”已不在,“纯粹的多处理器多核”每个核分配一个进程(线程),进程(线程)数目收到严格限制。

    2、编程所用的并行单位:将任务分解为进程或线程

     

    优点

    缺点

    进程(线程)间通信方式

    C++标准支持

     

    进程

    系统对它的安全进行部分管制;可以利用网络通信;通信少了很简单(属于高层接口)

    通信多了就复杂、慢、甚至不可能,因为系统对进程间通信的安全部分管制;进程间切换慢

    Signals/sockets/files/pipes

    线程

    同一个进程的所有线程共享同一地址空间,通信简单、灵活;线程间切换迅速

    数据的安全难保证

    共享地址空间

    C++使用的并行单位是线程。

    二、为什么使用并行?

    1、提供一种自然的思考方式,简化设计;

    2、提高性能,可以task parallelism(将应用分解为任务)、data parallelism(将数据分解为不同的部分);

    三、什么时候不使用并行?

    利大于弊。利:一种自然的思考方式、性能;弊:编程复杂、线程切换费时。

    四、c++标准线程库的效率:

    很多要求高性能的程序员在使用c++时候都担心abstraction penaltyc++标准委员在设计标准库的时候考虑到了这个,尤其是线程库,他们承诺:there should be little or no benefit to be gained from using the lower-level APIs directly提供两种接口low-levelhigh-levellow-level在新的内存模型上提供原子操纵库,这些原子操作甚至可以替代以前要用基于平台的汇编写的程序。High-level接口并没有太多的abstraction penalty标准库承诺它的功能跟你自己手写函数调用Low-level接口效率一样,并且进行了很好的内联。High-level可能包含一些函数你不需要,但是千万别自己去用low-level去实现,得不偿失,在使用STL的一个被证实的事实是:瓶颈在于你的应用程序的设计而不是库的实现。

     

    例子很简单,不解释了。

  • 相关阅读:
    转载Dockerfile 中 RUN, CMD, ENTRYPOINT 的区别
    在linux上通过ssh使用github
    dns服务
    centos6 free 和 centos 7的free 的差异与对比
    无重复字符的最长子串
    go get命令在go mod目录下与正常目录执行的区别
    安装git
    转载 筛子算法之golang实现求素数解析
    Go语言基础之并发
    go之无缓冲channel(通道)和有缓冲channel(通道)
  • 原文地址:https://www.cnblogs.com/jiafenggang/p/5482533.html
Copyright © 2020-2023  润新知