C++ 多线程学习笔记(1)基础概念:并发、进程、线程

一、并发、进程、线程

1. 并发、进程的基本概念和综述

(1)并发

  1. 什么是并发
    • 两个或者更多的任务(独立的活动)同时发生(执行)
  2. 上下文切换
    • 定义:过去的计算机,只有一个CPU,同一时刻只能执行一个任务,并发的实现要靠操作系统调查CPU,每秒中进行多次 “任务切换”,这就是上下文切换
    • 进行上下文切换是有时间开销的(切换时涉及保存环境信息和恢复环境信息)
    • 利用上下文切换,可以实现一种并发的假象,不是真正的并发
  3. 硬件并发
    • 随着硬件的发展,出现多核CPU,这时就能让不同的核心执行不同的任务,实现真正的并发
  4. 使用并发的原因
    • 同时执行多个任务,提高性能

(2)可执行程序

  • 定义:磁盘上的一个文件,window下是.exe文件

(3)进程

  • 定义
    • 进程就是程序的运行
    • 一个可执行程序运行起来,就可以看作创建了一个进程

(4)线程

  1. 主线程

    • 每个进程都有一个主线程,这个主线程是唯一的,一个进程中有且只有一个主线程
    • 产生一个进程后,主线程就随着这个进程的创建自动启动起来
    • 运行一段程序的时候,本质上是进程的主线程来执行(调用)这个main函数中的代码
    • 主线程和进程同生同灭
  2. 线程

    • 用来执行代码的
    • 可以理解成一条代码的执行通路,程序运行时,主线程的通路是从main开始到return结束
    • 除了主线程之外,可以通过代码创建其他线程(子线程),他们可以走不同于主线程的其他通路
    • 每创建一个新线程,就可在同一个时刻多执行一个任务
  3. 多线程(并发)

    • 线程不是越多越好,都需要一个独立的堆栈空间(1M左右)
    • 线程之间的切换是有开销的,线程太多,切换太频繁,反而会降低效率
  4. 例子

    • 游戏服务器,给每个玩家开一个线程,比如
      • 玩家一线程处理充值
      • 玩家二线程处理抽卡
      • 玩家三线程处理…
  • 小结

    • 线程是用来执行代码的

    • 把线程理解为一条代码的执行通路(道路),一个线程代表一个新的通路

    • 一个进程自动包含一个主线程,主线程随着进程默默启动并运算,我们可以通过编码来创建多个其他线程(非主线程),但是创建的数量不宜太多

    • 因为主线程是自动启动的,所以一个进程中至少有一个线程(主线程)

    • 说白了,多线程程序就是可以同时干多个事情,运行效率高

2. 并发的实现方法

  • 并发
    • 两个或者更多的任务(独立的活动)同时发生(执行)

(1)多进程并发

  1. 创建多个进程,每个进程一个主线程,靠多个主线程实现并发

  2. 每运行一个可执行程序,就多一个并发进程

  3. 进程间可以相互通信

    • 同一个电脑上的进程间通信
      • 管道
      • 文件
      • 消息队列
      • 共享内存
    • 不同电脑上的进程间通信
      • socket

(2)多线程并发

  1. 在单一进程里创建多个线程来实现并发(自己写代码创建除了主线程外的其他线程)
  2. 每个线程都有自己的运行路径
  3. 一个进程中的所有线程共享内存
    • 全局变量、指针、引用都能在线程之间传递
    • 好处:线程间共享内存的特点使得线程间通信非常方便,开销小,因此多线程开销远远小于多进程
    • 坏处:数据一致性问题,比如两个线程要操作同一块内存空间,可能互相影响(如读者-写者问题)
  4. 需要并发时,优先考虑多线程技术

(3)总结

  1. 和进程比,线程有如下优点
    • 线程启动更快,更轻量级
    • 系统资源开销更小,执行速度更快(比如共享内存实现了线程间快速通信)
  2. 和进程比,线程有如下缺点
    • 使用有一定困难,要小心处理数据一致性问题

3. C++11新标准线程库

  1. 以往的C++多线程要使用操作系统提供的多线程接口,函数不同不能跨平台;要实现跨平台得配置库,麻烦
  2. 从C++11开始,C++语言本身提供了多线程支持,实现了C++多线程程序的跨平台
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值