一、线程互斥
1、什么是线程互斥
保证只有一个执行流进入临界区
2、如何实现线程互斥——互斥量(互斥锁)-悲观锁
(1)pthread_mutex_init——动态初始化互斥量
PTHREAD_MUTEX_INITIALIZER静态初始化,不需要销毁
(2)pthread_mutex_destroy——销毁互斥量,回收资源
(3)pthread_mutex_lock——对互斥量加锁
(4)pthread_mutex_unlock——释放互斥锁
(5)pthread_mutex_trylock——非阻塞尝试加锁
(6)pthread_mutex_timedlock——限时加锁
(7)pthread_mutexattr_settype——设置锁类型
(8)pthread_mutexattr_gettype——读取已经配置的锁
3、如何实现互斥锁有效——即抢锁有效
硬件xchg将查看锁以及拿到锁以及换锁封装成原子操作,保证只有一个线程可以成功的拿到锁
4、CAS锁-乐观锁
依托cmpxchg将比较判断写入封装为原子操作的前提,通过先计算再原值是否改变,改变了则再试一次,没改变则写入数据,不加锁
补充:
(1)竟态条件:多个线程争抢同一共享资源时的场景并可能产生错误的危险
(2)抢占式:即内核可以随时将CPU切换给其他线程,而不等线程使用完
(3)同步:协调进程/线程,使其执行预期行为
(4)同步机制:一套规则或工具,用来实现线程顺序执行
实现工具有:互斥锁、信号量、条件变量、原子操作、读写锁
二、可重入vs线程安全
1、线程安全:多个线程对同一变量进行操作时不会出现结果不同
可重入:同一函数被不同执行流调用,当前执行流还没有结束另一执行流开始进行该函数称为重入,结果无误则为可重入,结果有误则为不可重入
三、死锁
1、什么是死锁:
一组进程或线程占有一定的资源同时又在等待别的线程已占用的资源的现象