Linux:线程(thread)

目录

一、线程的基本概念

二、进程和线程的核心区别;

三、线程的创建

四、线程的调度

五、线程的消亡

六、多进程和多线程优缺点:(资源丰富用进程,资源紧缺用线程------效率上半斤八两,进程像立交桥,线程像平面交通,如果考虑到)

六、线程相关函数接口


一、线程的基本概念

1.概论:线程是 "轻量级(创建的是栈区)进程(所以有进程特性)",它不能独立存在,必须依附于某个进程(进程是线程的 "资源容器" )。

2.作用:实现并发处理------ 比如一个程序要同时下载文件 + 显示进度,用线程分任务比开多个进程更高效。

3.核心特征:

进程是 "最小资源分配单位"(系统给进程分配内存、文件描述符);线程是 "最小执行单元"(CPU 实际调度的是线程)。

同一进程内的线程是 "平级关系",仅默认存在一个 "主线程"(进程启动后自动创建的第一个线程)。

二、进程和线程的核心区别;

总结:

进程是操榨系统资源分配的最小单元(进程可以独立存在,线程必须依附于进程而存在)

线程是CPU任务调度的最小单元(线程在CPU中会被认为是一个进程)

三、线程的创建

每个线程会创建一个属于该线程的独立的栈空间默认为8M,文本区、数据区、堆区使用进程中的区域

四、线程的调度

等同于进程的调度

宏观并行微观串行

五、线程的消亡

等同于进程的消亡,线程消亡需要回收线程空间

六、多进程和多线程优缺点:(资源丰富用进程,资源紧缺用线程------效率上半斤八两,进程像立交桥,线程像平面交通,如果考虑到)

1.进程(Linux中用得更多)(不同一软件间用进程)

优点:①每个进程空间独立,安全性好,一个进程异常崩溃不影响其余进程

缺点:①多线程调度,效率低,因为切换进程任务时需要映射不同的物理地址空间,增大系统开销 ②多进程通信不方便,因为空间独立,没有共享空间

2.线程(Windows中用得更多)(同一软件内不同任务用线程)

缺点:线程位于进程空间内部,线程异常崩溃会导致进程崩溃,进程中其余的线程均结束

优点:①多线程调度,效率高,因为在同一进程空间内部切换不同任务

②多线程通信非常方便,多线程数据区,堆区共享

③通过锁的机制防止资源竞争

六、线程相关函数接口

注意:

①头文件:#include <pthread.h>

②编译时需链接库

  1. pthread_create

原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

功能:创建一个线程任务

参数:

thread:存放线程ID空间首地址

attr:线程的属性,使用默认属性传NULL

start_routine:线程函数入口(即线程函数名)

arg:线程函数的参数(没有则使用默认属性传NULL)

返回值

成功:返回0

失败:返回错的数

示例:创建四个线程,每个线程打印自己的id

结果:

补充:

代码改进(pro版):

代码改进(max版):

结果:

  1. pthread_exit

原型:void pthread_exit(void *retval);

作用:线程主动结束自身执行。(与线程函数里的return NULL效果相同)

参数 retval:线程的"返回状态"(可被后续回收操作获取)

返回值:缺省

3.阻塞式回收: pthread_join

原型:int pthread_join(pthread t_thread, void **retval);

作用:阻塞回收线程空间(相当于进程中的wait)(等待指定线程结束,并回收其资)

特点:调用该函数a'a的线程会"阻塞"(暂停执行),直到目标线程结束

参数:

thread:线程

retval:存储目标线程的返回状态(对应 pthread_exit 的参数)

返回值:

成功:返回0

失败:返回非0

应用:

阻塞回收线程空间

实现线程的同步(保证pthread_join后续代码是在线程结束之后执行)

代码:

结果:

  1. pthread_self() //获得线程ID号

使用线程与调函数的区别

相关推荐
良木生香1 小时前
【C++初阶】C++入门相关知识(1):C++历史 & 第一个C++程序 & 命名空间
c语言·开发语言·c++
黎雁·泠崖1 小时前
【魔法森林冒险】11/14 战斗系统(二):多波战斗与BOSS战
java·开发语言
csbysj20203 小时前
PHP Mail - 发送邮件的最佳实践指南
开发语言
jdbcaaa3 小时前
Go 语言 runtime 包的使用与注意事项
开发语言·后端·golang·runtime
ZHOUPUYU5 小时前
PHP 8.3网关优化:我用JIT将QPS提升300%的真实踩坑录
开发语言·php
寻寻觅觅☆10 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t10 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
小白同学_C10 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖10 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构