线程互斥
在多线程环境中运行的代码段,需要考虑是否存在竞态条件,如果存在竞态条件,我们就说该代码段不是线程安全的,不能直接运行在多线程环境当中,对于这样的代码段,我们经常称之为临界区资源,对于临界区资源,多线程环境下需要保证它以原子操作执行,要保证临界区的原子操作,就需要用到线程间的互斥操作-锁机制,thread类库还提供了更轻量级的基于CAS操作的原子操作类。
存在竞态条件的代码段(临界区代码段):代码在多线程的环境下执行,随着线程调度顺序不同,结果不同。----->原子操作
原子操作:如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。
若在多线程条件下不存在竞业条件--->可重入
线程通信
1. 条件变量+互斥锁(mutex mtx,condition_variable cond)
2. 信号量
(两个线程时序一前一后)
互斥锁和信号量区别:
互斥锁(线程同步之线程互斥),信号量(线程同步之线程通信)
类似(线程互斥)条件变量+互斥锁的实现:
信号量可以在不同线程中调用,可能线程1正在执行临界区代码段,线程二调用sem.post,线程3就可以执行临界区代码段
PV操作
P就是wait操作(sem.wait),等待资源,V就是++操作(sem.post),释放资源
1.信号量:
P就是(sem.wait),等待sem信号有资源
V就是(sem.post),增加资源以供其他执行,等待资源的线程从阻塞态变成就绪态
2.条件变量
P就是(cond.wait),等待cond信号有资源
V就是(cond.notify_all),将线程从等待状态变为阻塞态,不一定就绪,需等待解锁