首页 > 编程语言 >网络编程day04--线程管理

网络编程day04--线程管理

时间:2023-08-16 20:11:50浏览次数:41  
标签:结束 函数 -- day04 int 线程 pthread 进程

线程管理

基本概念

1、线程是进程的执行路线,它是进程内部的控制序列,线程是进程的一部分,进程是一个资源单位,而线程是执行单位,线程是进程执行的实体,负责真正的执行
2、线程是轻量级的,没有自己的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前工作目录等资源,进程中的所有线程都共享以上资源
3、每个线程都有自己独立的栈内存、线程ID、错误码、信号掩码、程序计数器、调度的优先级
4、一个进程中可以包含多个线程(多条不同的执行路线),但是至少要有一个线程,进程刚创建成功时必定有一个线程,也称为主线程
5、ps -T -p < pid > 查看进程pid的线程信息,还可以htop命令查看
6、线程是进程的实体,可作为系统独立的任务调度和分配的基本单位
7、线程有不同的状态,系统提供了线程的控制接口,例如:创建、销毁、控制等
8、进程中的所有线程都在同一个虚拟地址空间中工作,进程中的所有资源对于它的线程来说都是共享的,尽管线程有属于自己的栈内存等资源,但是没有添加保护机制,对于其它线程的这些资源是可见的,当多个线程协同工作时需要解决的首要问题是资源竞争的问题(上锁)
9、线程的系统开销小、任务的切换速度快,同进程的多个线程之间不需要数据交换、也就不需要类似进程间通信的机制进行线程间通信,因此使用线程相对简单而高效
10、线程之间有优先级之分

POSIX线程

1、早期的UNIX和早期的Linux是没有线程概念的,微软的Windows系统首先使用的线程概念,之后UNIX和Linux也逐渐增加使用线程
2、早期各个厂商都提供自己私有的线程库,各自的接口实现差异比较大,不易于移植,世界标准化组织1995年指定了统一的线程接口规范,遵循这套标准的线程统称为POSIX线程,简称pthread
3、pthread包含一个头文件 pthread.h 和一个共享库 libpthread.so
-lpthread 编译参数

线程管理
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 
//功能:创建线程 
//thread:输出型参数,用于获取线程ID 
//attr:线程属性,一般不设置属性给NULL即可 
//start_routine:线程的执行入口函数,类似于该线程的主函数main 
//arg:传递给入口函数的参数 
//返回值:成功0,失败返回错误编码

注意:入口函数的参数和返回值要确保它们的持久化

方法1:使用全局变量参数

方法2:赶在参数释放前,把参数的值立即保存到入口函数的栈内存中

注意:从表面上看当主线程结束后,子线程也会随之一起结束,但实际上子线程之所以结束是因为主线程执行了main函数中隐藏的return语句,导致整个进程结束,所有线程都属于进程的一部分,会随着进程一起被结束回收,假如只是通过pthread_exit只结束主线程,子线程不会随着主线程结束的
注意:子线程执行入口函数结束后,子线程也结束了

int pthread_join(pthread_t thread, void **retval);
//功能:等待线程结束,并获取结束时入口函数的返回值、释放线程资源
//thread:要等待的线程ID
//retval:用于获取线程结束时返回值的地址
//返回值:成功0,失败返回错误编码,等待线程还未结束则阻塞

int pthread_equal(pthread_t t1, pthread_t t2);
//功能:判断两个线程id是否相同,相同返回非零,不相同返回0
//注意:部分系统中的线程ID是以结构实现的,因此不能直接使用==运算符

pthread_t pthread_self(void);
//功能:获取当前线程的线程ID
线程的执行轨迹
同步方式:可结合状态(joinable)     默认的

在使用默认属性创建线程时,线程属于joinable态,该类线程必须在另一个线程中使用pthread_join函数等待其结束并释放线程资源,如果该类线程在结束时没有任何线程执行pthread_join回收其资源,该线程就变成"僵尸线程"。每个"僵尸线程"都会消耗一些系统资源,当有太多的"僵尸线程"存在时,可能会导致创建线程失败

异步方式:分离状态(detach)

当把线程设置为detach态时,线程结束无需经过pthread_join函数回收资源,由系统负责回收资源
注意:为了避免线程资源的泄漏,要么显式地调用pthread_join回收资源,或者设置为detach态

int pthread_detach(pthread_t thread); 
//功能:让线程分离,变成detach态 
//thread:想要变成detach态的线程id

两种方式:
1、线程自己调用
pthread_detach(pthread_self())
2、其他线程(创建者)
pthread_detach(threadid);
注意:如果先执行了pthread_join进入等待后,才对线程进行分离,join不会立即结束,而是一直等到线程结束才返回
任务:实现多线程版本的TCP多客户端服务器

线程的终止

1、线程执行完入口函数的最后一行代码
2、线程调用pthread_exit函数,结束该线程
void pthread_exit(void *retval);
功能:向本线程发出取消请求,如果响应该请求,则线程会终止
retval:线程入口函数的返回值,会返回给pthread_join
3、如果进程结束(前三种情况),那么它所有的线程都会随之结束
4、向指定的线程发出取消请求
int pthread_cancel(pthread_t thread);
默认情况下都会响应取消请求
thread:要杀死的线程id

线程的属性

pthread_attr_t的定义:

typedef struct
{
   int                       detachstate;     线程的分离状态
   int                       schedpolicy;     线程调度策略
   struct sched_param        schedparam;      线程的调度参数
   int                       inheritsched;    线程的继承性
   int                       scope;           线程的作用域
   size_t                    guardsize;       线程栈末尾的警戒缓冲区大小
   int                       stackaddr_set;
   void *                    stackaddr;       线程栈的位置
   size_t                    stacksize;       线程栈的大小
}pthread_attr_t;

通过 pthread_attr_setxxx 设置线程相关属性
通过 pthread_attr_getxxx 获取线程相关属性

标签:结束,函数,--,day04,int,线程,pthread,进程
From: https://www.cnblogs.com/bigflyny/p/17636069.html

相关文章

  • 【DSP】关于多速率信号处理以及其信号能量与功率的变化问题
    插值(上采样,upsampling)和抽取(下采样,downsampling)是数字前端中经常使用的操作。进行上采样时在信号间插入0,以提高信号的速率,相当于增加了采样率;进行下采样时,每隔一段信号进行抽取,相当于降低了信号的速率,降低了采样率。上采样和下采样往往发生在数字前端,如DAC前和ADC后,主要目的是为......
  • AcWing 858. Prim算法求最小生成树
    题目给定一个$n$个点$m$条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图$G=(V,E)$,其中$V$表示图中点的集合,$E$表示图中边的集合,$n=|V|,m=|E|$。由$V$中的全部$n$个......
  • 1-2分支程序设计实验
    EXTRNInitKeyDisplay:NEAR,Display8:NEAR,GetKeyB:NEAR_STACKSEGMENTSTACKDW100DUP(?)_STACKENDS_DATASEGMENTWORDPUBLIC'DATA'BUFFERDB8DUP(?)DATAENDSCODESEGMENTSTARTPROCNEARASSUMECS:CODE,DS:_DATA,SS:_STACKMOVAX,_DATAMOV......
  • 通用与垂直大模型之战:大模型驱动的商业智能变革之路
    科技云报道原创。是做通用大模型还是垂直大模型,这一个争论在“百模大战”的下讨论愈发热烈。目前,以微软、谷歌、百度、阿里等为代表的发力于通用大模型的科技大厂,也都开始推动大模型在垂直领域的商业化落地。比如说,微软和谷歌已将大模型技术融入操作系统、文档、搜索和邮件等产品中......
  • 模拟集成电路设计系列博客——1.1.3 Cascode电流镜
    1.1.3Cascode电流镜Cascode电流镜是一种高输出阻抗电流镜,其基本结构如下图所示:首先从\(Q_2\)漏极看进去的输出阻抗仅为\(r_{ds2}\),其分析和基本电流镜非常一样。因此可以认为\(Q_4\)是一个带有\(r_{ds2}\)的源极退化电阻的电流源,利用之前的\((1.1.10)\)公式,可以得到:\[r_{out}......
  • Feign + Sentinel 流控、降级、热点
    一、Docker1、docker-composesentinel:image:bladex/sentinel-dashboardcontainer_name:sentinel-dashboardrestart:alwaysenvironment:JAVA_OPTS:"-Dserver.port=8858-Dcsp.sentinel.dashboard.server=localhost:8858-Dproject.name=sentinel-da......
  • 今天遇到的bug总结
    1、BindingException:Parameter'name'notfound.Availableparametersare[employee,param1]这是我在使用xml文件编写SQL语句,来新增员工时遇到的报错,写着找不到参数"name",应该写做employee.name,后发现是我在mapper的intsave(Employeeemployee)方法中写了@Param("employee......
  • 网络编程day03--多路复用
    TCP服务端处理多客户端任务:原来是通过开启子进程来服务不同的客户端,当客户端退出时就关闭该子进程多路复用:使用一个进程(有且只有一个主进程)同时若干个文件描述符,这种读写模式称为多路复用多用于TCP的服务端,用于监控客户端的连接和数据的收发优点:不需要频繁地创建、销毁进程......
  • 来单提醒_代码开发
       ......
  • [React Typescript] Fixing type inference in a Custom React Hook
    //Problemimport{useState}from"react";import{Equal,Expect}from"../helpers/type-utils";exportconstuseId=(defaultId:string)=>{const[id,setId]=useState(defaultId);return[id,setId];};const[id,setI......