linuxC线程pthread的相关理解

て烟熏妆下的殇ゞ 提交于 2019-12-06 13:12:24
1. 线程概念  Linux里的线程,也叫轻量级进程(light weight process),本质上是进程。  Linux早期是没有线程的,后来的线程是借助进程实现的。线程、进程的核心都是调用系统的clone方法实现。  线程和进程的区别:(说明:PCB即进程控制块)    进程拥有PCB,用于独立的地址空间。是操作系统最小资源分配单位。(独居地址空间)    线程也有PCB,但没有独立的地址空间,共享同一个地址空间。是操作系统最小执行单位。(合租地址空间)    Linux内核线程实现原理:    1)轻量级进程,也有PCB,创建线程使用的底层方法和进程一样都是clone方法。    2)线程有各自的PCB,但是各自的PCB指向内存资源的三级页表是相同的。所以地址空间是相同的,即共享地址空间。    3)线程可看作是寄存器和栈的集合。  三级页表映射:进程PCB -> 页目录(可看作数组,首地址位于PCB里)-> 页表(可看作数组元素) -> 物理页表 -> 内存单元  线程共享的资源:    文件描述符、信号处理方式、当前工作目录、用户ID和组ID、内存地址空间(.text/.data/.bss/heap/so)  线程非共享的资源:    线程ID、处理器现场和内核栈指针、用户空间栈、errno变量、信号屏蔽字、线程调度优先级、线程调度策略
2. pthread线程函数  pthread_t pthread_self(void);//获取线程id,类似于进程里的getpid()函数。  pthread_create(pthread_t* tid, pthread_attr_t* attr, void*(run)(void*), void* arg);//创建一个线程,类似于进程里的fork()函数。    attr参数//线程属性,需要调用pthread_attr_init()函数初始化,然后再设置属性,最后调用pthread_attr_destroy()销毁。    run参数//是一个函数指针,形式 void* run(void*){},是线程创建成功后的回调函数,该函数执行周期既是线程生命周期,即该函数执行完线程就结束。    arg参数//run函数的参数。  pthread_exit();//退出一个线程,类似于进程里的exit()函数。    注意1:任一个线程里调用exit()函数的话,进程退出,导致所有线程都会退出。所以退出一个线程应该调用pthread_exit()函数。    注意2:主线程return返回后,进程退出了,此时所有的子线程都会退出。  pthread_join();//主线程阻塞等待子线程退出,并获取子线程退出状态码。类似于进程里的wait()函数  pthread_detach();//使线程处于分离状态,也就是说该线程执行完后自动释放所有资源包括回收PCB。  pthread_cancel();  pthread_equal();  

3.

4.

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!