首页 > 编程语言 >C++多线程 第一章 你好,C++并发世界

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

时间:2024-01-28 16:45:02浏览次数:22  
标签:并行 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++执行并行化的程序,这很值得我们庆祝,不是吗?

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

标签:并行,C++,并发,任务,线程,多线程
From: https://www.cnblogs.com/mesonoxian/p/17992988

相关文章

  • Windows Server 2012 R2 安装 Visual C++ Redistributable (VC_redist.x64) 失败 0x80
    PHP8需要 VisualC++RedistributableforVisualStudio2019,但怎么都装不上,有个0x80240017-未指定的错误。 看日志 Windows8.1-KB2999226-x64.msu好像有补丁安装失败了,网上找到一篇解决办法:https://blog.51cto.com/u_12701820/3032471能成功安装VC,但是PHP8无法......
  • C++类指针未初始化导致访问成员变量时报段错误
    #安装gcc和g++yuminstallgccyuminstallgcc-c++.x86_64//a.cpp#include<iostream>#include<unistd.h>usingnamespacestd;classTest{public:  voidtest1(){  }  voidtest2(){    age=10;  }private:  intage;}......
  • C++线程安全:共享数据的完美守护者
     概述:C++中,为解决线程间共享数据问题,常用互斥锁。通过定义共享数据和互斥锁,编写线程函数,并在操作前使用互斥锁,确保线程安全。在实际应用中,注意选择合适的同步工具和控制互斥锁粒度,提高并发性能。在C++中,线程间共享数据可能会导致竞态条件(RaceCondition)和数据不一致性的问题......
  • py 学习(c++ to py)
    py1:print2024-01-2723:18:57星期六#这里是注释#py1:基础print总结'''aaa有时候也用三个单引号当注释但其实是字符串交互式会输出'''print("helloworld")print("自动换行")print("hello","world","逗号隔开自动空格")pri......
  • 一文总结现代 C++ 中的初始化
    本文尝试回答:现代C++有哪几种初始化形式?分别能够用于什么场景?有什么限制?MyClassobj();为什么没有调用默认无参构造函数创建一个对象?newint和newint()有什么区别?直接初始化、拷贝初始化、列表初始化、默认初始化、值初始化、类内初始值、构造函数初始值列表的区别与......
  • Golang并发控制方式有几种?
    Go语言中的goroutine是一种轻量级的线程,其优点在于占用资源少、切换成本低,能够高效地实现并发操作。但如何对这些并发的goroutine进行控制呢?一提到并发控制,大家最先想到到的是锁。Go中同样提供了锁的相关机制,包括互斥锁sync.Mutex和读写锁sync.RWMutex;除此之外Go还提供了原子操作......
  • 从C向C++5——友元和string
    一.对象特性(续)1.空指针访问成员函数C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针。如果用到this指针,需要加以判断保证代码的健壮性。如果调用的成员函数不访问成员属性,那么空指针可以调用对应的成员函数,如果该函数涉及了成员属性,那么就相当于涉及了this指针,空......
  • c++实现一门计算机语言到手撸虚拟机实战200节
    1对于编程语言实现原理提供了实战。2学习之后对于JAVA,PHP,PY等语言的实现原理提供了经验平移参考3对JAVA等语言的虚拟机实现原理提供了实战参考。4加深对编程语言的驾驭和深度认知。5虚拟机是计算机系统中非常重要的组成部分,理解了虚拟机的原理和实现方式,从而更好地理解计算......
  • 实现多线程的方式有哪几种?
    Java虚拟机时是运行所有Java程序的抽象计算机,允许应用并发的运行多个线程。在Java语言中,多线程的实现,一般有以下3中方法:1.实现Runnable接口,并实现该接口的run()方法;主要步骤:1.自定义类并实现Runnable接口,实现run()方法;2.创建Thread类,用实现Runnable接口的对象作为参数实例化......
  • 如果在循环中不改变vector的大小,C++编译器是否会将.size()优化为常数?
      在C++中,可以使用以下代码计算vector<int>中所有元素的和:vector<int>v={1,3,7,9};sums=0;for(inti=0;i<v.size();i++){sums+=v[i];}  这是一段很普通的代码,问题在于:在这段代码中,v.size()会在循环开始前仅计算一次?还是会在每次循环中都计算一次......