C++多线程 第一章 你好,C++并发世界

第一章 你好,C++并发世界


C++并发

并发(concurrency): 主要包括 任务切换硬件并发 两类.

并发(concurrency) 实际上与 多线程(multithreading) 存在差异.

并发的种类

任务切换(task switching): 计算机在某一时刻只可以真正执行一个任务,但它可以每秒切换任务许多次.通过做一点这个任务然后再做一点别的任务,看起来像是任务在并行发生.这就是:任务切换(task switching).

硬件并发(hardware concurrency): 无论拥有多个处理器或一个多核处理器,这些计算机能够真正并行运行超过一个任务.为了实行交替进行,系统在从一个任务切换到另一个时都需要进行 上下文切换(context switch).决定其效率最重要的因素是 硬件线程(hardware threads) 的数量.

并发的方法

多进程并发: 将应用程序分为多个独立的单线程进程,它们通过通信互相传递信息.

多线程并发: 在单个进程中运行多个线程.

并发的应用情景

任务并行(task parallelism): 将一个单一任务分成几部分并且各自并行执行,从而降低总运行时间.

数据并行(data parallelism): 一个线程执行算法的一部分,而另一个线程执行算法的另一部分;或者每个线程在不同的数据部分上执行相同的操作.

C++并发的特征

资源获得即初始化(RAII): C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用.通过这种方式可以保证线程在退出相关作用域时互斥元被解锁.

抽象惩罚(abstraction penalty): 与直接使用底层的低级工具相比,使用高级工具所带来的实现成本一般会更多.

C++并发程序

我们前面已经学习过OpenMP解决并发问题的方式了,现在让我们快速进入如何使用C++解决并发问题.

下面是一个常见的Hello World程序:

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    return 0;
}

让我们来将其并行化:

#include <iostream>
#include <thread>

void hello()
{
    std::cout << "Hello Concurrent World\n";
}

int main()
{
    std::thread t(hello);
    t.join();
    return 0;
}

这是我们第一个通过C++执行并行化的程序,这很值得我们庆祝,不是吗?

晚上去吃门口的那个什么铜鼎锅吧,记得吃麻酱碟(

posted @ 2024-01-28 16:33  Mesonoxian  阅读(11)  评论(0编辑  收藏  举报