接下来一节就是线程管理
在线程管理这一节包括几个部分
一是线程创建
第二个是线程函数的参数与返回值
第三个是线程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’
就这个意思
这个就是我们的线程创建
很简单吧
简单的一个函数调用搞定了