一.线程概念
1.1概念:
线程是一个进程内部的控制序列。
1.2进一步理解:
这里的线程是Linux下的线程,从操作系统角度理解进程是资源分配的实体,则线程就是资源调度的最小单位,假如创建一个进程,不创建地址空间(站在操作系统角度,是进程的资源窗口),用户级页表,甚至不进行IO将程序的数据和代码加载到内存,只创建task_struct,然后让新的PCB,指向和老的PCB指向同样的mm_struct。 然后通过合理的分配资源(当前进程的资源),让每个task_struct都能使用进程的一部分资源。这个时候我们每个PCB被CPU调度的时候,执行的粒度比之前的原始进程执行的粒度要更小一点。
1.3本质
线程就是进程内部的一个执行流,所以一个进程内部会存在多个执行流这些线程共享进程的资源,线程就是在进程的地址空间内进行运行。
1.4优缺点
优点:线程间通信的成本很低,(线程共享进程的资源)
缺点:一定存在大量的临界资源,势必要使用各种互斥和同步
1.5扩展**
Linux上的线程是进程模拟的也就是轻量级进程,在Windows上有实实在在的线程。
二,线程和进程等的对比
2.1
进程是资源分配的基本单位
线程是调度的基本单位
2.2,线程很多资源是共享的,但是线程有自己独享的资源:上下文数据,
独立的栈空间。
三,线程控制
3.1,线程创建:
与线程有关的函数构建了一个库,要使用这些函数库,要引入头文件<pthread.h>,链接这些线程函数库时要使用编译命令-lpthread选项。
3.2线程退出
首先不能用exit来终止进程,exit是用来终止进程的。
1.终止线程的方式可以用从线程函数进行return(这里对主线程不适合,在主线程中return相当于调用exit),
2.还可以使用pthread_exit这个去终止线程自己。
这里需要注意的一点是这里的指针返回的内存单元必须是全局的或者通过malloc分配的,如果是其他线程函数栈上的内存单元的,当这个指针返回给其他的线程时,这个线程函数就会退出了。
3.也可以使用pthread_cancel函数
三个线程终止的方法使用比较推荐前两个,第三个会存在去终止主线程,出现僵尸线程导致bug。
3.3线程等待
线程终止之后一定要进行等待,main_thread进行等待,如果不等待,会造成类似僵尸进程导致内存泄漏问题。已经退出的线程,空间没有被释放,仍然在进程的地址空间内。新线程的创建不会用旧线程的地址空间。
线程等待作用:
1.防止内存泄漏
2.保证主线程最后退出,保证新线程正常运行。
3.通过pthread_join获得新线程退出时的退出码信息
3.4线程分离
线程分离本质是让主线程不再join新线程,从而可以让新线程退出的时候,自动回收资源。
线程分离的函数:
这里的线程分离既可以是线程组内其他线程对目标线程的分离,也可以是线程自己分离。
一个线程不能既是分离状态又是jionable状态。这个两个状态时互斥的。