拥有梦想是一种智力,实现梦想是一种能力。

 

线程&进程

通常线程指的是共享相同地址空间的多个任务,每个任务是一个线程,而这种多线程的机制构成一个进程。普通进程只有一个线程,那就是main()函数的执行;而多线程进程可以有多个线程,main()是主线程,其他是子线程。

进程

  • 进程有独立的地址空间
  • Linux为每个进程创建task_struct
  • 每个进程都参与内核调度,互不影响

 

线程

  • 进程在切换时系统开销大
  • 很多操作系统引入了轻量级进程LWP
  • 同一进程中的线程共享相同地址空间
  • Linux不区分进程、线程

 

比如,我们要实现同样一个服务,使用多线程要比多进程好得多。多线程大大提高了任务切换的效率,避免了额外的TLB & cache的刷新。

 

多线程共享资源和私有资源


一个进程中的多个线程共享以下资源

  • 可执行的指令
  • 静态数据
  • 进程中打开的文件描述符
  • 当前工作目录
  • 用户ID
  • 用户组ID

 

每个线程私有的资源包括

  • 线程ID (TID)
  • PC(程序计数器)和相关寄存器
  • 堆栈
  • 错误号 (errno)
  • 优先级
  • 执行状态和属性

 

线程操作

通过pthread线程库,我们可以创建线程、回收线程、结束线程

和进程的使用类似,在主线程中通过pthread_create创建一个子线程,在线程内容执行完通过pthread_exit()结束线程,子线程结束后调用pthread_join来回收线程。

 

线程创建 – pthread_create

 #include  <pthread.h>
 int  pthread_create(pthread_t *thread, const
       pthread_attr_t *attr, void *(*routine)(void *), void *arg);

  •  成功返回0,失败时返回错误码
  •  thread 线程对象
  •  attr 线程属性,NULL代表默认属性
  •  routine 线程执行的函数
  •  arg 传递给routine的参数
     

 

线程结束 – pthread_exit


 #include  <pthread.h>
 void  pthread_exit(void *retval);
       

  •  结束当前线程
  •  retval可被其他线程通过pthread_join获取
  •  线程私有资源被释放
     

 

线程回收 – pthread_join

 #include  <pthread.h>
 int  pthread_join(pthread_t thread, void **retval);
       

  •  成功返回0,失败时返回错误码
  •  thread 要回收的线程对象
  •  调用线程阻塞直到thread结束
  •  *retval 接收线程thread的返回值