在上一篇博客中我介绍了Linux中的线程是什么样的,就如同进程可以通过
fork创建,可以被终止,可以退出一样,线程也可以被我们用户控制,这
篇博客我会介绍线程的控制,并且基于线程的控制所产生的一些问题进行
解决这些问题
线程的控制
1. 线程的创建
我们要学会对线程的控制,首先得创建出来一个线程,所以我们会认识一个接口:
这就是我们创建线程的一个接口,可以看出它是三号手册中的,并不是系统调用,这一点之后会从多方面来解释它。
它的第一个参数就是线程的id,类型是ptread_t,这是一个输出型参数需要用户自己传入,然后它给你带出线程的id。
第二个参数是有关于线程的属性的参数,我们现在不谈论,传参时传空指针就可以。
第三个参数是一个函数指针,这个函数的参数是void*,返回值也是void*,这个函数也就是线程要执行的函数。
这第四个参数就是第三个参数中函数的参数,它是以这种方式来传的。
下面我们就可以来编写一简单的代码了(其实也是我们上一章博客中所写的):
当我们写好代码之后直接使用g++编译的时候会出现下面的情况:
这其实是因为pthead_create函数,它不是系统调用,它是存在于库中的,但是它也不是C/C++标准库,所以我们在编译的时候要加上这么一个选项:
而pthread库它有一种叫法,叫做系统原生库,顾名思义就是只要有操作系统,那么就一定会携带这个库。
那么这个库为什么会形成单独的库,而不是和系统代码在一起呢?我们上一章说过Linux中不存在真正意义上的线程,只存在轻量级进程,而对于用户来说,我们刚接触Linux的话哪能知道什么是轻量级进程,我们只知道线程,所以操作系统就必须实现出关于线程的一套接口便于用户使用,这也就会形成了一个pthread库了,不和系统代码在一起是因为Linux中真正意义上根本没有线程这个说法。
a. 多线程的创建
既然能创建一个线程,那我们就能够创建多个线程:
在这段代码所演示的结果中我们可以看到几个现象:
task_thread函数被多个执行流同时执行,那就说明这个函数被重入了。
CPU对于线程的调度也是随机的,这一点是理所应当的,因为我们刚开始解除CPU的调度的时候,它的调度就不是完全按顺序来的。
假如现在我们对四号线程进行除0的操作: