当前课程知识点:基于Linux的C++ > 第十四讲 线程编程 > 14.3 线程管理(一) > LinuxCPP1403
接下来一节就是线程管理
在线程管理这一节包括几个部分
一是线程创建
第二个是线程函数的参数与返回值
第三个是线程ID
第四个是线程的属性
接下来三个是线程的撤销
线程局部存储和线程的清除
我们一个一个地解释
首先来看线程的创建
在pthread库里边提供了一个函数
pthread_create()创建一个线程
而这个函数需要带四个参数
第一个参数是thread
它是指向pthread_t的一个指针
第二个参数是attr
它是指向pthread_attr_t的一个指针
第三个参数是一个函数指针
回调函数参数嘛
它就是我们的线程那个执行的函数
它会指向那个线程函数
第四个就是一个附加参数arg
线程的创建有一个基本的流程
第一个要定义指向pthread_t
这样的一个指针
这里就会保存线程的ID
然后你要定义
指向线程属性对象的一个指针
如果你不需要去设定
这个线程的属性对象
那么这个指针你可以直接传NULL
这个对象你也可以不定义
如果你需要设定这个属性
那么你就必须定义这个对象
设定好以后然后把它的地址
传给pthread_create()这个函数
第三步 要定义指向线程函数的
这样的一个指针对象
让它指向那个固定格式的
线程执行函数
你不定义直接传那个线程执行函数的
那个地址过来 也OK
第四个 就要实现那个线程函数
线程函数的参数和返回值
它有一个固定的格式
都是哑型指针
如果线程需要接受多个参数
那么你就要把这些参数都打包
形成一个结构
然后传递它的地址过来
这个线程的返回值呢
如果也有很多个
那么你也可以把这个结果打包
把它的地址传出去
这是这个意思
最后在线程退出的时候
我们可以使用它的返回值
把这个返回值传给这个主调线程
主调线程不就可以用了嘛
这个很典型
有一点是需要说明的
pthread_create()这个函数
在线程创建完毕之后
它就会立即返回
它不等待那个线程执行结束
从操作系统线程调度的这个角度来讲
你的程序中不能依赖
这些线程执行的先后关系
如果你需要明确
它们之间的先后执行关系
那么你就必须使用线程的同步机制
你自己去固定它
去明确这一点
不能对操作系统调度
做任何预先的假定
这是特别需要说明的地方
线程的退出方式有三种
一个线程函数结束执行 它就会退出
第二个是调用pthread_exit()这个函数
退出线程的执行 线程就会结束
第三就是被其它线程所撤销
那么它也有可能就中止执行
这里边实现了两个函数
PrintAs()、PrintZs()
它会打印一系列的‘a’和打印一系列的‘z’
函数实现都非常简单
就像标准错误流里面输出数据就完了
主函数在这里
定义pthread_t的一个对象thread_id
这就是我们的线程ID
然后调用pthread_create()这个函数
创建一个线程
传thread_id的地址
第二个参数传NULL
第三个参数传线程函数PrintAs
第四个参数传NULL
Over 这个线程一创建完毕
操作系统内部
就会有这样一个线程的存在
然后它就会被调度
你就不用管了 它就会运行了
创建完这个线程之后
PrintZs() 我们再打印‘z’
那个子线程负责打印‘a’
这个主函数呢 负责打印‘z’
就这个意思
这个就是我们的线程创建
很简单吧
简单的一个函数调用搞定了
-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 编程实践
-第十五讲 网络编程--编程实践提交入口