首页 > 其他分享 >day03

day03

时间:2023-08-25 16:57:06浏览次数:41  
标签:结束 函数 day03 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 获取线程相关属性










标签:结束,函数,day03,int,线程,pthread,进程
From: https://www.cnblogs.com/ymy1/p/17657360.html

相关文章

  • 标准C++ -- day03
    一、对象的创建和销毁过程分析对象的创建过程给对象划分内存空间执行初始化列表根据继承表的顺序调用父类的无参构造或者有参构造通过:父类名(val)调用父类的有参构造根据成员变量的定义顺序调用类类型成员的无参构造或者有参构造通过:类类型成员名(val)调用类......
  • day03
    随机读写:  每个打开的文件都有一个记录读写位置的指针,也称文件位置指针,对文件的读写时该指针会自动往后移动,因此顺序读写时无需操作  当需要去文件的任意位置进行读写时,才需要调整该指针的位置  标准IO:    intfseek(FILE*stream,longoffset,intwhen......
  • JavaSE学习笔记day03
    一、异常处理机制当程序中抛出异常时,会导致整个程序中断执行。若要程序不受影响,可以继续往下执行,则使用异常处理机制。异常处理机制:try-catch-finally语法结构:try{可能会抛出异常的代码}catch(异常类型变量名){处理异常的代码}finally{......
  • 网络编程day03--多路复用
    TCP服务端处理多客户端任务:原来是通过开启子进程来服务不同的客户端,当客户端退出时就关闭该子进程多路复用:使用一个进程(有且只有一个主进程)同时若干个文件描述符,这种读写模式称为多路复用多用于TCP的服务端,用于监控客户端的连接和数据的收发优点:不需要频繁地创建、销毁进程......
  • day03 - 链表part01
    203. 移除链表元素/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,ListNode*next):v......
  • 20天 hot 100 速通计划-day03
    子串239.滑动窗口最大值给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例1:输入:nums=[1,3,-1,-3,5,3,6,7],k=3输出:[3,3,5,5,6,7......
  • Linux环境编程day03--文件管理
    分别使用标准IO和系统IO写入一百万个整数到文件,测试谁的时间更短?为什么?结论:在同等数据的写入下,使用标准IO要比直接使用系统IO更快原因:标准IO有缓冲区机制,在执行fwrite写文件时,数据不是直接调用系统IO写入磁盘,而是先存放在内存的缓冲区中,直到缓冲区满后才会调用一次系统IO全部写......
  • [代码随想录]Day03-链表part01
    题目:203.移除链表元素思路:做链表首先最好有个虚拟头指针,这样做删除添加操作的时候可以统一操作否则还得特判。那删除元素的过程,从虚拟头指针开始要做以下几步:如果当前p的next不为空,那么就可以进行判断如果p的next的值是val(↑p的next不为空↑),那么就把p的next修改为p的下......
  • day03课程回顾
    课程回顾进制十进制转换二进制十进制数除以2倒取余数二进制转换十进制二进制转换八进制从低位次开始三位一组,如果最高位不足三位补0,将每一组三位二进制转换为八进制八进制转换二进制一个八进制数转换成三个二进制数,不足的位次补0二进制转换十六进制从低位次......
  • 初学C语言day03--数据类型及循环分支语句
    一、数据类型为什么要对数据进行分类?1、现实中的数据就是自带类别属性的2、对数据进行分类可以节约内存存储空间、提高运行速度存储空间的单位:Bit比特存储一个二进制位,只能存储0或者1,计算机存储数据的最小单位Byte字节存储八个二进制位,计算机存储数据的基本单位Kb102......