代码编织梦想

 基础概念理解

线程:轻量级的进程,本质是进程

线程有独立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很危险

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_55093622/article/details/127972827

线程知识点(笔记)-爱代码爱编程

线程 线程基于线程安全的单例模式双重双重检查锁(推荐使用)synchronized和Lock锁的区别?锁wait和sleep的区别?execute()和submit()区别线程池合理利用线程池能够带来三个好处线程池的作用为什么要用线程池比较重要的几个类死锁什么是死锁产生死锁的条件线程三大特性可见性解决线程间变量的不可见性的方案有两种常见方式vola