1.什么是线程
线程:轻量级的进程
2.什么时候用多进程,什么时候用多线程
创建和销毁较频繁使用线程,因为进程花销大
大量数据传输使用线程,因为多线程切换速度快,不需要跨越进程边界
安全稳定选进程,快速频繁选线程
3.线程的相关函数
3.1 创建线程
3.2 阻塞等待子线程结束回收子线程资源
2.回收子线程资源
1.pthread_join()主线程回收资源
2.pthread_detach()使子线程属于分离状态,不阻塞,子线程退出自己回收自己的资源
3.pthread_join()和pthread_detach()区别
1)pthread_join():
创建线程默认的属性就是joinable的,此时需要pthread_create与pthread_join配合使用;
线程创建者通过pthread_join获取线程函数返回值,释放资源等。(jion可以理解为孩子与父母没有分家,有些事还需要父母帮忙完成。)
2)pthread_detach():
使用该函数可以将子线程与主线程分离,子线程结束后,自己回收自己的资源,而不需要主线程回收资源(detach可以理解为孩子与父母分家,事情都需要自己完成)
3.线程的退出
1.主动退出 pthread_exit()
可以和pthread_join()配合使用,子线程给主线程传值
2.被动退出 pthread_cancel()
4.线程间数据的传递,除了栈区之外,其他数据(全局变量/堆区)是共享的
1.验证全局变量和堆区是共享的
2.主线程给子线程传值
3.子线程给主线程传递
5.线程的互斥和同步
互斥:
1.什么是互斥
多线程同时访问临界资源,当某线程正在执行,不允许其他线程访问资源
2.买票问题
客户端: 1.火车站售票窗口 10以上
2.移动端:12306网址
3.12306APP
西安--->郑州 10月20 G567 16车8F
张三 西安--->郑州 10月20 G567 16车8F
除了张三之外看不见
2.如何实现线程互斥
- 引入互斥(mutual exclusion)锁的目的是用来保证共享数据操作的完整性。
- 互斥锁主要用来保护临界资源
- 每个临界资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源
- 线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止
互斥锁
创建锁:
pthread_mutex_t 全局的锁
初始化
pthread_mutex_init()
上锁
pthread_mutex_lock()
释放锁
pthread_mutex_unlock()
同步:
1.什么同步
多线程同时访问临界资源,线程按照某种顺序执行
2.如何实现同步
无名信号量: ---->只能线程中使用
有名信号量 ---->进程中使用
信号灯集 ----->进程间通信
信号量本质上是一个非负的整数计算器,它用来控制对公共资源的访问。
当信号量用于互斥操作时,往往只设置一个信号量。
当信号量用于同步操作时,往往会设置多个信号量,并安排不同的初始值来实现它们之间的顺序执行。
Linux实现POSIX的无名信号量,
sem_init() 初始化信号量.
sem_wait() -----P操作 -1
在信号量大于零时, P操作 信号量-1
若信号量的值为零时,阻塞线程
sem_post() -----V操作 +1
给信号量的值加1,同时唤醒等待的线程
sem_getvalue() 获得信号量的值
sem_destroy()用于删除信号量