系统编程—线程

概念

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

工作原理

线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤销线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。

阻塞(Block):如果一个线程在执行过程中需要等待某个事件发生,则被阻塞。

适用范围

  1. 服务器中的文件管理或通信控制
  2. 前后台处理
  3. 异步处理

特征

  1. 进程是系统中最小的资源分配单位
  2. 线程是系统中最小的执行单位
  3. 进程中,线程与线程是平级关系
  4. 在进程中,默认有一个线程,那个是主线程

与进程的区别

  1. 线程可以资源共享,进程资源对立。 线程有各自的栈区,这个区域独立。
  2. 稳定行,进程相对稳定,线程不稳定(如果进程中多线程,其中一个崩溃,整个进程崩溃);
  3. 创建的开销,线程创建需要在进程空间中,开辟一个新的栈区(8MB) .新建一个进程的话,需要创建3GB空间。
  4. 并发度,线程的并发高于进程的并发度。

线程编程步骤****POSIX

创建多线程 ->线程空间操作->线程资源回收(线程退出后,默认栈区不释放)
线程有两个基本类型

用户级线程:管理过程全部由用户程序完成,操作系统内核心只对进程进行管理。

系统级线程(核心级线程):由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行、撤销线程。

线程的状态变化

(1)创建线程

当创建一个新的进程时,也创建一个新的线程,进程中的线程可以在同一进程中创建新的线程。

(2)终止线程

可以正常终止自己,也可能某个线程执行错误,由其它线程强行终止。终止线程操作主要负责释放线程占有的寄存器和栈

(3)阻塞线程

当线程等待每个事件无法运行时,停止其运行。

(4)唤醒线程

当阻塞线程的事件发生时,将被阻塞的线程状态置为就绪态,将其挂到就绪队列。进程仍然具有与执行相关的状态。例如,所谓进程处于"执行"状态,实际上是指该进程中的某线程正在执行。对进程施加的与进程状态有关的操作,也对其线程起作用。例如,把某个进程挂起时,该进程中的所有线程也都被挂起,激活也是同样。

线程相关函数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:该函数可以创建指定的一个线程。
参数:

  1. thread 线程id,需要实现定义并由该函数返回。
  2. attr 线程属性,一般是NULL,表示默认属性。
  3. start_routine 指向指针函数的函数指针。本质上是一个函数的名称即可。称为th回调函数,是线程的执行空间。
  4. arg 回调函数的参数,即参数3的指针函数参数。

返回值:

  1. 成功 0
  2. 失败 错误码

获得id号
pthread_t pthread_self(void); unsigned long int; %lu
功能:获取当前线程的线程id
参数:无
返回值:

  1. 成功 返回当前线程的线程id
  2. 失败 非0值;

线程退出函数
void pthread_exit(void *retval); exit return p;
功能:子线程自行退出
参数: retval 线程退出时候的返回状态,临死遗言。
返回值:无
结束线程
int pthread_cancel(pthread_t thread);
功能:请求结束一个线程
参数:thread 请求结束一个线程tid
返回值:

  1. 成功 0
  2. 失败 非0值;

线程空间的回收 --》》阻塞方式
int pthread_join(pthread_t thread, void **retval);
功能:通过该函数可以将指定的线程资源回收,该函数具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞。
参数:

  1. thread 要回收的子线程tid
  2. retval 要回收的子线程返回值/状态。==》ptread_exit(值);

返回值:

  1. 成功 0
  2. 失败 非0值;

分离属性,给某个线程设置的属性,如果线程设置了这个属性,那么,线程在退出后,相关资源(栈区)会被系统回收,原来创建者,就不能回收了。
目的线程消亡,自动回收空间。
int pthread_deatch(pthread_t thread);
功能,设置分离属性
参数,线程id号,填自己的id
返回值:

  1. 成功 0
  2. 失败 非0值;
相关推荐
葛二蛋2 小时前
深入ClassLoader:从双亲委派到SPI
jvm
MicoZone3 小时前
jvm(更新中)
jvm
东华万里4 小时前
Release 版本禁用 assert:NDEBUG 的底层逻辑与效率优化
java·jvm·算法
听风吟丶7 小时前
Java NIO 深度解析:从核心组件到高并发实战
java·开发语言·jvm
a努力。8 小时前
小红书Java面试被问:ThreadLocal 内存泄漏问题及解决方案
java·jvm·后端·算法·面试·架构
4***14908 小时前
高并发时代的“确定性”挑战——为何稳定性正在成为 JVM 的下一场核心竞争?
java·开发语言·jvm
代码代码快快显灵8 小时前
Android跨应用数据共享:ContentProvider详解
jvm·数据库·oracle
大大大大物~9 小时前
JVM 之 垃圾回收算法及其内部实现原理【垃圾回收的核心问题有哪些?分别怎么解决的?可达性分析解决了什么问题?回收算法有哪些?内部怎么实现的?】
jvm·算法
冰冰菜的扣jio9 小时前
JVM中的垃圾回收详解
java·jvm