并发
1)加锁mutex
获取不到锁就休眠,让出CPU;
==>去尝试获取锁,并不怎么耗时间。 等拿到锁,比较耗时间。
使用场景:只有一个连接时,去连接数据库。 假如:有3个线程去,这时去竞争,那么就可以用mutex,让竞争不到的不要死等。
为什么不能用自旋锁呢? 因为会忙等,等于啥也不干空耗CPU。
2)自旋锁
获取不到锁,继续去检测;
获取自旋锁:如果不能及时获取,它是一个忙等待的过程,占CPU。
使用场景:
(1)其实就是看任务执行的时间长度,不能存在阻塞。
(2)任务耗时短。
3)无锁CAS
其实也是一种锁,但是锁的粒度不太一样。
锁:总线。
4)无锁使用: 队列,放入和读取非常频繁的时候.
5)锁使用场景的选择(其实就是看锁的粒度[共享区域的粒度])
mutex: 共享区域运行时间比较长 ==>因为会让出CPU,不白耗CPU。
atomic: 简单的数字+-。
spinlock: 执行的语句比较少,不存在阻塞.
内核态到用户态的消耗。 因为阻塞等待的消耗。
=========================队列的3个版本
线程不安全的
mutex
无锁的