提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、线程间通讯
1.资源竞争
线程运行的方式是异步的,对一段代码,cpu运行、一段内存都是竞争关系,谁先谁后不确定。
2.解决资源竞争问题
采用互斥锁的来解决线程间资源竞争的问题:
加锁
操作共享资源
解锁
临界资源:同一时刻只允许被一个任务操作的资源
临界代码、临界区:加锁和解锁中间的代码。
用途:在线程中使用全局变量就要使用互斥锁
3.互斥锁函数接口
1.初始化
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
功能:
初始化互斥锁
参数:
mutex:互斥锁的首地址
attr:互斥锁的属性(默认属性 NULL)
返回值
成功返回0
失败返回非0
2.销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:
销毁互斥锁
参数:
mutex:互斥锁的首地址
返回值
成功返回0
失败返回非0
3.加锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:
加互斥锁
参数:
mutex:互斥锁的首地址
返回值
成功返回0
失败返回非0
4.解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:
解互斥锁
参数:
mutex:互斥锁的首地址
返回值
成功返回0
失败返回非0
原子操作:
不被cpu打断的一次操作
4.死锁条件
死锁:
多个线程在通讯时,由于加锁导致多个线程任务无法同时继续向下执行而产生的状态,成为死锁。
成为死锁的条件:
1.互斥条件
锁资源只能同时被一个任务使用
2.不可剥夺条件
锁资源被一个任务使用不能被其余任务剥夺
3.请求保持条件
自身占据资源的情况下,申请获得新资源
4.循环等待条件
多个任务申请组成环形,导致无法获得资源,而一致等待资源
死锁如果解决:
1.注意加锁顺序
2.使用pthread_mutex_trylock实现枷锁
3.打破互斥或者不可剥夺条件(不建议使用)
二、同步
概念:在某一时刻让任务有时间关系
1.信号量
信号量是一种资源,可以申请(资源数-1)可以释放(资源数+1)
PV操作:实现任务的同步
2.函数接口
同步:
多任务使用信号量实现任务同步
信号量:是一种资源
信号量可以被申请可以被申请(-1)释放(+1)
pv操作:
P:申请资源
V:释放资源:
1初始化信号量:
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:
初始化信号量
参数:
sem:信号量空间首地址
pshared:
0 线程间共享
非0 进程间共享
value:信号量初值
返回值:
成功返回0
失败返回-1
2.销毁一个信号量
int sem_destroy(sem_t *sem);
功能:
销毁一个信号量
参数:
sem:信号量空间首地址
返回值:
成功返回0;
失败返回-1
3.int sem_wait(sem_t *sem);
功能:
申请资源
参数:
sem:信号量首地址
返回值:
成功返回值0;
失败返回-1
4.int sem_post(sem_t *sem);
功能:
释放资源
参数:
sem:信号量首地址
返回值:
成功返回值0;
失败返回-1
总结
提示:这里对文章进行总结: