线程安全:多个线程对临界资源进行访问而不会对数据造成二义性
如何实现线程安全:同步+互斥
同步:对临界资源访问的时序和理性
互斥:对临界资源同一时间访问的唯一性
如何实现互斥:互斥锁
实现线程互斥的五步
1、定义互斥锁变量
pthread_mutex_t
2、对互斥锁变量初始化
pthread_mutex_init(mutex, attr) attr属性变量一般置空NULL
3、对临界资源之前,先枷锁
pthread_mutex_lock(&mutex),若可以加锁,直接修改计数,函数返回。否则挂机等待【阻塞等待操作】
pthread_mutex_trylock 如果可以枷锁,直接修改计数器函数返回。否则报错返回【非阻塞等待操作】
pthread_mutex_timedlock, 如果可以枷锁,直接修改计数器函数返回。否则给定一定时间,如果超时之后,再报错返回【非阻塞等待操作】
4、对临界资源操作完毕之后,解锁
pthread_mutex_unlock(&mutex);
5、销毁互斥锁
pthread_mutex_destroy(&mutex);
死锁:多个线程对锁之源竞争访问,但是因为推进顺序不当,导致相互等待,使得程序无法往下运行‘
1、互斥条件 一个锁只有一个线程可以加
2、不可剥夺条件 我加的锁被人不能解
3、请求与保持条件 拿着A锁,去请求B锁 但是获取不到B锁,也不释放A锁
4、环路等待条件 我拿着A锁,对方拿着B锁强求A锁
死锁的预防:只能避免的是环路等待。 破话四个必要条件
死锁的避免:
1、死锁检测算法
2、银行家算法 调研一下
线程间同步的实现:
等待 +唤醒
操作条件不满足------等待
别人条件满足 ------唤醒
条件变量:
条件变量实现同步:
线程在对临界资源访问之前,先判断是否能够操作;若可以操作则线程直接操作;
否则若不能操作,则条件变量提供等待功能,让pcb等待在队列上
其他线程促使条件满足,然后唤醒条件变量等待队列上的线程
实现线程同步的五步:
-
定义条件变量 pthread_cond_t
-
条件变量初始化 pthread_cond_init(&cond, &attr);
-
用户在判断条件不满足的情况下提供等待功能 pthread_cond_wait(&cond, &mutex);
-
用户在促使条件满足后,唤醒等待pthread_cond_signal(&cond) 【至少唤醒一个线程】\pthread_cond_broadcast(&cond)【唤醒全部等待的线程】
-
销毁条件变量pthread_cond_destroy(&cond)