linux之自旋锁
常见的各种锁
悲观锁:在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁(读锁,写锁,行锁等),当其他线程想要访问数据时,被阻塞挂起。
自旋锁(修改)
像是互斥锁,信号量,当我们申请失败了!那么进程在系统级别上就会被挂起——这种我们一般都称之为挂起等待锁
对于临界资源,我们可以加锁保护!然后对临界资源进行区域性的使用!——例如:环形队列!
为了能够理解自旋锁我们先举个例子
如何评估线程待在临界区时间长短!
在代码层面我们去理解是很难有一个结论的!——重点是要结合场景!
==但是一般来说——当临界区里面有高复杂度的计算!IO操作,等待某转软件条件!大概率是要挂起等待的!==
==如果临界区里面!仅仅是一个简单的内存操作!一些代码很短,执行速度很快的代码我们就可以采用自旋锁!==
**不过自旋我们一般很少会去使用!因为虽然自选在==正确的评估时间长短的情况下==确实是比挂起等待更快!——==但是一旦评估出错!就会大量的消耗CPU资源!==**而且如果是在挂起等待的时候出现死锁!那么无非就是两个线程互相阻塞!但是一般自旋锁里面出现了类似死锁的情况!所有的执行流都会疯狂的自旋检测锁的状态!没有人去释放锁!那么就有可能会让我们的CPU瞬间就被打满!==所以自旋锁是有危险的!大部分没有特殊要求的情况下,或者及其确定使用自旋锁不会出问题且场合十分适合自旋!都是推荐使用挂起等待!==
因为评估在临界资源的长短是由程序员来决定的!使用那个方案也是由程序员来决定的!所以当如果我们真的不确定!我们可以选择都用一次!分别测试一下!那个效率高用那个!
一般系统层面代码使用的自旋锁更多!用户层面使用的会少一些
自旋锁的接口
初始化接口