概念

进程是资源分配的单位,同一进程中的多个线程共享该进程的资源。
Linux线程
Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程(被创建时只是复制了父进程的资源)。

线程控制/线程管理/线程操作

线程是一个资源对象

线程创建

类似进程,都是拷贝而来,而不能从零创造。

进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create。
每个线程都有自己的线程ID,以便在进程内区分。

线程退出(3种)

  1. 执行完成后隐式退出
  2. 线程本身显式调用pthread_exit退出
  3. 被其他线程调用pthread_cance终止

    join/detach

    控制线程退出顺序pthread_join,即一个线程需等待另一个线程的终止。

    线程A中调用pthread_join(线程B的tid),表明线程A将被挂起直到线程B终止。

API

pthread_create

  1. int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
  2. void *(*start_routine) (void *), void *arg);

pthread_join

  1. int pthread_join(pthread_t thread, void **retval);

pthread_detach

  1. int pthread_detach(pthread_t thread);

pthread_exit

  1. void pthread_exit(void *retval);

pthread_cancel

  1. int pthread_cancel(pthread_t thread);

线程通信

原则:互不影响、有序

线程互斥

互斥意味着“排它”,即两个线程不能同时进入被互斥保护的代码。

线程A修改全局变量g时,线程B不能准确的访问g。(两次访问的值不一致)

解决方案:互斥锁mutex

线程同步

同步就是线程等待某个事件的发生。只有当等待的事件发生线程才继续执行,否则线程挂起并放弃CPU。

解决方案:条件变量condition variable、信号量sem

注:条件变量使用时需要用互斥量加锁

信号量

互斥量

互斥量:互斥量是信号量的一种特例,他只有0和1两种状态(解锁和加锁)
关键区域:与互斥量类似,但是最大的区别在于,关键区域会进行忙等待,而互斥量如果不能解锁会自动让出CPU

互斥锁

读写锁

自旋锁

屏障

多线程

线程池

并发
解决:创建关闭线程耗费资源时间

线程共享资源分析

线程间到底共享了哪些进程资源?