linux 多线程基础

168 阅读1分钟
  • 参考 Linux多线程编程
  • 进程
    • 是程序执行时的一个实例
    • 担当分配系统资源(CPU时间、内存等)的基本单位
    • 拥有独立的地址空间,所以就算崩了也不会对其他进程有影响
    • 启动一个进程比启动一个线程要慢,因为需要给其分配独立的资源
    • 同时进程间的切换比线程间的切换要慢,因为每个进程的地址空间是独立的,在切换时,需要切换页表,需要切换内核栈和硬件上下文
  • 线程
    • 可以看成是进程里的一个最小执行单位
    • 一个进程里可以包含多个线程
    • 同个进程内的线程共享进程的所有资源
    • 所以一个线程崩了就会导致整个进程崩了
    • 线程的切换虽然也是耗费资源的,但对比进程的切换,还是相对节约一点的
    • 线程切换时不需要切换页表,因为共享了虚拟内存空间,但是需要切换内核栈和硬件上下文,这点跟进程切换是一样的
    • 线程拥有自己的堆栈,这个是不会跟其他线程共享的
  • 在linux下,多线程的实现主要是 pthread
  • 常用的api
    • 创建线程

      #include <pthread.h>
      int pthread_create (
          pthread_t *__restrict __newthread,          // 新创建的线程ID
          __const pthread_attr_t *__restrict __attr,  // 线程属性
          void *(*__start_routine) (void *),          // 执行函数
          void *__restrict __arg                      // 执行函数的参数
      )
      
    • 线程退出

      • 退出线程可以通过隐式退出,即执行完线程函数
      • 也可以通过显示调用 pthread_exit 来退出
      • value_ptr 是函数的返回代码,只要pthread_join中的第二个参数 value_ptr 不是NULL,这个值将被传递给 value_ptr
      void pthread_exit(void *value_ptr);
      
    • 线程等待

      int pthread_join( pthread_t  thread, void * * value_ptr );