1.采用信号量访问:当有段临界代码,需要保证排他的访问一个资源。
2.sudo dmesg -c 消除dmesg缓冲
3.互斥锁:代表的是一种锁资源,互斥锁的工作原理是:保证对共享资源操作的原子性
4.自旋锁:轮循
5.读写锁:奇偶
6.顺序锁:读写可并发,但是会检测信号
互斥锁中:
死锁:(1)互斥锁交叉嵌套
(2)同一个互斥锁嵌套使用
(3)占有锁资源的任务被异常退出,锁资源不会释放,比如,一个线程开了一个锁,还没来得及解锁,线程就被取消了。
避免死锁:申请锁,按顺序加锁,以防死锁。
7,锁和信号量不一样,比如要顺序执行时。
1).初始化互斥锁
函数原型: int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
功能: 初始化互斥锁
参数: mutex 互斥锁的标识符
attr 互斥锁的属性 NULL
返回值: 成功:0
失败 :错误码
2):执行上锁:
函数原型:int pthread_mutex_lock(pthread_mutex_t *mutex);
功能: 执行上锁操作
参数: mutex 互斥锁的标识符
返回值: 成功 0
失败:错误码
3):执行解锁
函数原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:执行解锁操作
参数: mutex 互斥锁的标识符
返回值:成功 0 ;失败:错误码;
4):释放锁资源:
函数原型:int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能: 摧毁锁资源
参数: mutex互斥锁的标识符
返回值: 成功0
失败:错误码
信号量:
申请信号量:p操作 -1
释放信号量:v操作 +1
当执行任务,申请信号量时,如果当前信号量的值大于0,申请成功,信号量减一,不大于0 则申请失败。会阻塞。
1)初始化信号量的值
int sem_init(sem_t *sem, int pshread,unsigned int value);
功能: 初始化信号量
参数:sem 信号量的标识符
pashred 0 用于线程间
非0 用于进程间
value 信号量的初始值
返回值: 成功 0
失败 -1
2)申请信号量
int sem_wait(sem_t *sem);
功能:申请信号量,信号量的值-1;
参数:sem 信号量的标识符
返回值:成功 0
失败 -1
3)释放信号量
int sem_post(sem_t *sem);
功能:释放信号量 信号量的值+1;
参数:sem 信号量的标识符
返回值 成功 0
失败 -1
4)摧毁信号量
int sem_destroy(sem_t *sem);
参数: sem 信号量的标识符
返回值: 成功 0
失败 -1
5)获取当前信号量的值
int sem_getvalue(sem_t *sem,int *sval);
参数: sem:信号量的标识符
sval 保存当前信号量的值。