当前课程知识点:基于Linux的C++ > 第十四讲 线程编程 > 14.2 线程基本概念 > LinuxCPP1402
我们首先来看线程基本概念
从定义这个角度来讲
什么是线程呢
线程就是比进程更小的程序执行单位
多个线程可以共享进程的全局数据
一个进程包括很多个线程
那么这些线程
就共享这个进程的全局的堆
这个堆是所有的线程所共享的
每个线程呢
因为它要执行自己的那个函数调用
所以线程都有自己独立的栈
但共享进程的堆
这是非常重要的一个地方
当然线程可以有自己的专有数据
这个没有问题
此前Linux是不支持多线程编程的
1996年以后Linux才开始支持多线程编程
LinuxThreads这个库
基本上是符合POSIX标准的
但是它有一些问题 效率也比较低
所以用的人其实不多
一直到2003年内核2.6之后
它提供了线程支持库NPTL
也就是我们俗称的pthread
Linux的多线程编程才逐渐引起重视
在Linux线程实现里
有内核线程 轻量级进程
和用户线程之分
它们是从不同的角度
讨论操作系统内部
是如何进行线程调度和管理的
首先你的操作系统内核本身
它如果支持多线程的调度或执行的话
那么它内部就会有所谓的内核线程
内核线程使用资源是非常少的
只包括内核栈和上下文切换时
所需要的那些寄存器存储空间
除此之外不需要多少别的东西了
这个就是内核线程
你操作系统内核必须支持这一个
这是一个 要有这个东西
第二就是轻量级的进程
此前Unix操作系统也好
Linux操作系统也好
都是以进程为单位进行程序调度的
那么在这种情况下面
调度的开销相当得大
所以后来为了降低进程调度的开销
它提出了一个轻量级进程的概念
就由内核支持的独立的调度单位
这种东西比进程的调度开销要小
所以称它为轻量级的进程
就是这个意思
系统要能够支持多个轻量级的进程
同时去运行
当然最后都会和我们的线程相关联
才能够被调度
这是轻量级进程
真正在开发的时候
我们要写的是用户线程
也就是建立在我们用户空间的
多个用户级的线程
这些东西怎么调度呢
它会映射到我们轻量级
进程里边去调度执行
然后在轻量级进程里边
再映射到内核线程里边去调度执行
它是这个意思
所以你的用户线程
在用户空间里创建 同步
维护 管理 销毁
这个开销就低了
算是比较经济的多线程实现的方案
每一个线程都有自己特定的ID
要特别说明的是
线程功能本身
不是C/C++标准库的一部分
所以你链接的时候
需要使用-pthread这样一个选项
否则是没有变法在Linux下边
写多线程程序的
另外线程功能
它是C++11标准库里边的一部分
所以你可以使用
C++11标准库里边的thread那个类
来构造一个线程对象 然后运行它
这是OK的
在C++11标准库里边还提供了
一系列的线程同步机制
你都可以和thread这个类配合着使用
从进程或线程的比较上来看
线程空间是不独立的
有问题的线程
它会影响到这个进程中的其它线程的
这是需要说明的 这是一个
这种影响的可能性是非常大的
而进程空间呢 它是独立的
有问题的进程也可能影响到其他进程
但是这个概率是相当小的
第二 创建进程
是需要额外的性能开销的
而创建线程的开销
它实际上是小的
当然它也需要额外的开销
但这个开销和进程的创建相比
开销要小得多
调度的时候也一样
开销要小得多
第三 线程主要用于开发
细粒度的并行性
而进程主要用于开发稍微粗一点的
我们称它粗粒度的并行性
两者使用的场合
有一点点细微的差别
其实很多事情
用多进程来做是OK的
用多线程做也OK
但是从从实现这个角度来讲
要开发细粒度并行性的话
用多线程来做
实际上要比用多进程来做
效果要好上那么一点
第四 线程很容易就能共享数据
而进程共享数据是非常困难的
它们的地址空间是完全独立的嘛
所以要想共享数据是非常困难的
你必须使用进程间的通讯机制
而线程很多时候
共享数据是非常非常容易的
你在进程中创建一个全局的对象
或者在堆中分配一个对象
那么这样一个对象就自然地
会被这个进程的全部线程所共享
这是线程和进程的差别
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口