线程小知识_简单点的学玩的博客-爱代码爱编程
基础概念理解
线程:轻量级的进程,本质是进程
线程有独立PCB,线程独立的只有寄存器和栈空间(为了保存寄存器的值),其余的都是公共的,线程是在进程的基础上创建的,一个进程最起码有一个线程(此时进程就是线程)
场景:一个人从独居到合租,206是一个进程,里面有6个人(线程),6个PCB(PCB都是自己独立存在的),,6个人(线程)都住在206(进程ID一样),206的路都是公用的,没有属于自己的路,但是有属于自己的床铺(相当于栈和寄存器)
线程是CPU最小的执行单元,进程是CPU分配资源的最小单位
场景:宿管阿姨(CPU)为每一个寝室(进程)分配垃圾桶和扫把, 每天6个人(线程)轮流使用扫把扫地(轮流占用CPU,并且只能每一次只能有一个)
一个进程的线程越多,更容易获取CPU的占有权,在CPU眼里线程就是进程
由于线程是linux后面产生的,属于后来的产品,与之前的产品是不太配的,
比如:不推荐信号和线程一起用 、不稳定、gdb调试不好
优点:通信方便,因为共享
进程中的线程共享资源:.text/data/bss/heap(除床以外的空间)(全局变量会共享)
不共享:栈(相当于自己床上的空间)
函数讲解
pthread_self:获取线程ID(在进程中标识线程身份的)
LWP是线程号,区分线程ID和线程号,线程号是给CPU的,让CPU划分时间片
pthread_create:创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
第一个:线程ID(自己创建的) 第二个:属性(一般为NULL)
第三个:线程函数(相当于回调函数,需要自己定义名字)
第四个:传递给回调函数的参数
留个小问题:第四个传递参数只能传递一个吗?---这个有点意思,需要自己尝试一下
初学遇到问题:主线程打印成功,但是其他的线程却没有打印
其他线程需要执行的话,必须此时的主线程没有执行完(此时的主线程就是进程),就相当于我住在206的前提是,206这个房子还在
问题:如何创建N个线程?(如何保证每一个线程的功能不一样呢?)
写代码的注意事项
注意点:
1:传递参数的类型(类型的严谨问题-例如像Freertos它一般都存在类型转化),一般会接触强转,强转的时候你需要考虑数据是否会丢失
return 、exit、Pthread_exit的使用和区分
exit直接结束进程,因此可能会导致未执行的线程不会被执行,不管你在哪里执行了exit,主线程都会结束,exit是直接控制主线程的
return:是返回到调用者,除非你在主线程中使用了return,否则不会结束主线程
pthread_exit:结束线程,可以结束字线程也可以结束主线程
一般不要使用exit很危险