Day35_多线程

来源:互联网 发布:linux mount phyaddr 编辑:程序博客网 时间:2024/05/22 10:58
多线程
  主流操作系统中,允许多个进程同时运行,每个进程的内存 支持 多线程同时运行。在一个进程的内部如果想有多端代码同时执行,必须使用多线程
  main()其实就是一个线程,叫主线程。除了主线程,进程中还有其它的线程,形成了多线程
  进程是重量级的,每个进程都需要自己独立的内存空间,资源开销非常大
  线程是轻量级的,不需要拥有自己独立的内存空间,共享进程的资源(内存、文件等)即可,但每个线程 需要有一个独立的栈空间
  大量的代码并行都是使用多线程实现
  线程并行原理:
    代码运行需要 内存和CPU,内存可分,但CPU不可分,真正的并行其实是不存在的,CPU运行速度非常快,而且长期空闲。人的感官其实是需要时间的,比如:视觉需要0.1秒,0.1秒=100毫秒。CPU执行100毫秒的方式作出了调整:CPU时间片方式。CPU时间片就是CPU执行很短的一小段时间,比如1毫秒。CPU执行100毫秒就变成了100个CPU时间片。比如有4个线程,每个线程先分配一个CPU时间片,谁先运行都有可能,但4毫秒以后,一定是每个线程都运行了一毫秒,再次分配CPU时间片。100毫秒的结果->每个线程都运行了25毫秒->并行
  关于线程:
    线程之间代码乱序执行,每个线程的内部代码还是顺序执行
    线程之间 互相独立,又互相影响
    主线程结束,进程随之结束,所有线程也结束了
    线程编程的API已经写好,按步骤来即可,规范定义在pthread.h中,代码定义在共享库文件中(libpthread.so)。所有函数都是以pthread_开头。创建线程的函数:pthread_create()。
    int pthread_create(pthread_t* id,pthread_attr_t* attr,void* (*fa)(void* arg),void* arg);
    参数:id 用于存储线程ID(很大的整数)
          attr 线程的属性,传0即可(默认属性)
          fa 是函数指针,启动线程需要定义线程代码的函数,传入pthread_create()
          arg 是线程代码函数的参数,如果不需要,传0即可
    返回值:正确返回0,错误返回错误码,线程的函数不使用errno,而是直接返回错误码,使用strerror()可以转换错误码为错误信息
    调用pthread_create()的工作流程:
      系统中的线程调度 启动一个线程,然后把线程ID存入参数id中,同时线程在分配了CPU时间片后,调用fa(),并把arg作为参数。
      如果在线程a中调用了pthread_join(b,二级指针),线程a停止运行,等待线程b结束,并把线程b的返回值放入二级指针
      取线程的返回值 必须先等线程结束,pthread_join()可以获取线程的返回值
      
  线程的终止:
    正常终止的方式:
     1.pthread_exit()函数
     2.在线程函数中执行return语句
       其实这两种方式没什么区别
  线程的状态:
    非分离状态和分离状态
    分离状态的线程 一旦线程结束立即回收资源,因此分离状态的线程join无效
    非分离状态的线程 线程结束不一定立即回收资源,但 join的线程会在join()返回时回收资源
    因此,线程最好分离或者join()
    分离的函数:pthread_detach()
    join的函数:pthread_join()
  线程的取消(了解)
    不是所有的线程都可以被取消,设置了取消的才可以,也可以设置不支持取消
    
    pthread_cancel() - 取消线程函数
    pthread_setcanceltype() - 设置取消的时间点,包括 立即取消和下一个取消点 再取消
    pthread_setcancelstate() - 设置是否可以被其它线程取消。

原创粉丝点击