概念
进程是资源分配的单位,同一进程中的多个线程共享该进程的资源。
Linux线程
Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程(被创建时只是复制了父进程的资源)。
线程控制/线程管理/线程操作
线程创建
类似进程,都是拷贝而来,而不能从零创造。
进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create。
每个线程都有自己的线程ID,以便在进程内区分。
线程退出(3种)
- 执行完成后隐式退出
- 线程本身显式调用
pthread_exit
退出 - 被其他线程调用
pthread_cance
终止join/detach
控制线程退出顺序pthread_join
,即一个线程需等待另一个线程的终止。线程A中调用pthread_join(线程B的tid),表明线程A将被挂起直到线程B终止。
API
pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
pthread_join
int pthread_join(pthread_t thread, void **retval);
pthread_detach
int pthread_detach(pthread_t thread);
pthread_exit
void pthread_exit(void *retval);
pthread_cancel
int pthread_cancel(pthread_t thread);
线程通信
原则:互不影响、有序
线程互斥
互斥意味着“排它”,即两个线程不能同时进入被互斥保护的代码。
线程A修改全局变量g时,线程B不能准确的访问g。(两次访问的值不一致)
线程同步
同步就是线程等待某个事件的发生。只有当等待的事件发生线程才继续执行,否则线程挂起并放弃CPU。
解决方案:条件变量condition variable
、信号量sem
信号量
互斥量
互斥量:互斥量是信号量的一种特例,他只有0和1两种状态(解锁和加锁)
关键区域:与互斥量类似,但是最大的区别在于,关键区域会进行忙等待,而互斥量如果不能解锁会自动让出CPU
互斥锁
读写锁
自旋锁
屏障
多线程
线程池
并发
解决:创建关闭线程耗费资源时间