线程的学习

1、线程概念:
    线程是一个轻量级的进程     light process
    每一个线程都属于一个进程
    
    
    进程是操作系统资源分配的最小单元
    线程是CPU任务调度的最小单元
    
    线程是一个任务执行的过程,包括创建、调度、消亡
    创建:
        线程空间位于进程空间内部

        进程:
            1.文本段
            2.数据段
            3.堆区

    进程中的每个线程,栈区是独立的,共享进程中的数据区和文本区,堆区。

    调度:
        宏观并行、微观串行
        
        与进程调度保持一致

    线程消亡:
        线程执行结束后,需要回收线程空间
        
2、多进程和多线程的优缺点:
    1.执行效率:
        多线程执行效率高(并发程度(创建速度快)和任务切换(在一个进程空间内部完成多线程任务切换))
        多进程执行效率低
    
        
    2.通信角度
        线程可以共享空间,可以直接通信(多线程间可以使用全局变量通信,因为全局变量为共享空间)
        进程空间独立,不能直接通信(通信必须使用:管道、信号、消息队列、共享内存、信号灯等方式)
        
    3.安全性:
        多进程安全(一个进程异常结束不影响其余进程执行)
        多线程不安全(一个线程异常结束会导致进程结束,其余线程均无法继续执行)

    4.内存消耗
        
        

3、线程的设计框架  posix
    线程实现接口:
    系统调用     pthread线程库
    fork        pthread_create 
    exit        pthread_exit 
    wait        pthread_join 

    
    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:给线程函数的参数
      返回值:
        成功返回0
        失败返回非0值

注意:一次pthread_create执行只能创建一个线程。
      每个进程至少有一个线程称为主线程。
      主进程退出则所有创建的子线程都退出。 
      主线程必须有子线程同时运行才算多线程程序。
      线程id是线程的唯一标识,是CPU维护的一组数字。
      pstree 查看系统中多线程的对应关系。
      多个子线程可以执行同一回调函数。
    ps -eLf 查看线程相关信息Low Weigth Process
    ps -eLo pid,ppid,lwp(线程id),stat,comm
    
2、pthread_t pthread_self(void); unsigned long int; %lu
   功能:获取当前线程的线程id
   参数:无
   返回值:成功 返回当前线程的线程id
               失败  -1;
               
               
练习题:
    1.设计多个线程模拟无人机任务处理:
      打印:正在拍照, 表明身份
           正在发送照片  表明身份
           正在获取指令   表明身份
           正在处理指令   表明身份
           主控正在工作        表明身份

    

    2.创建3个线程,将主线程中的变量cnt通过传参的方式,
     传给子线程,并在子进程中打印输出
     

线程的退出:
    1: 自行退出 -->自杀  -->子线程自己退出
        
        return NULL;
        
        
        void pthread_exit(void *retval);
        功能:子线程自行退出
        参数: retval 线程退出时候的返回状态,临死遗言。(不能是局部变量的地址)
        返回值:无

    
    2: 强制退出 ==》他杀  ==》被其他线程结束
        int pthread_cancel(pthread_t thread);
        功能:请求结束一个线程
        参数:thread 请求结束一个线程tid
        返回值:成功 0
                失败 -1;
        
        线程间可以指定被取消。
        
       
            char * retval ; r
            int * retval; 
      3:  int pthread_join(pthread_t thread, void **retval);    
          功能:通过该函数可以将指定的线程资源回收,该函数具有
                阻塞等待功能,如果指定的线程没有结束,则回收线程
                会阻塞。
          参数:thread  要回收的子线程tid
                retval  要回收的子线程返回值/状态。==》ptread_exit(值);
          返回值:成功 0
                  失败 -1;


        线程的回收
      1、线程的结束机制 ====》不同与进程没有孤儿线程和僵尸线程。
                  ====》主进程结束任意生成的次线程都会结束。(因为共享的进程空间被回收了)。
                  ====》次线程的正常结束不会影响主线程的运行。
                  
      子线程的回收策略:
      1、如果预估子线程可以有限范围内结束则正常用pthread_join等待回收。
      2、如果预估子线程可能休眠或者阻塞则等待一定时间后强制回收。
      3、如果子线程已知必须长时间运行则,不再回收其资源。

定义结构体:

结构体使用:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值