并发与竞态

作者: 酥酥肉 | 来源:发表于2019-08-25 11:30 被阅读0次

自旋锁

自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:

  • 自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,如果不能在很短的时 间内获得锁,这无疑会使CPU效率降低。
  • 在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。

用法

spinlock_t rtc_lock;
spin_lock_init(&rtc_lock);//每个驱动都会事先初始化,只需要这一次初始化
    
spin_lock_irq(&rtc_lock);
//临界区
spin_unlock_irq(&rtc_lock);

信号量

内核中的信号量通常用作mutex互斥体(信号量初值初始化为1就达到了互斥的效果)

  • 如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择

使用情景对比

需求 建议的加锁方法
低开销加锁 优先使用自旋锁
短期锁定 优先使用自旋锁
长期加锁 优先使用信号量
中断上下文中加锁 使用自旋锁
持有锁是需要睡眠、调度 使用信号量
  • 分不清楚就用mutex

相关文章

  • 并发与竞态

    自旋锁 自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者...

  • linux驱动之并发与竞态

    一、前言 在应用程序下经常会遇到 多线程并发访问同一资源 的问题,Linux 提供了多种机制来解决这一问题。在 L...

  • 【Golang】竞态条件 (Race Conditions)

    欢迎关注微信公众号:全栈工厂 1. 什么是竞态条件? 竞态条件是指在并发环境中,当有多个事件同时访问同一个临界资源...

  • 数据库事务--事务隔离级别

    数据库里关于事务的并发问题,也叫做竞态条件(race condition)。它是描述并发事务中,一个事务需要读取另...

  • linux的并发和竞态管理

    1 并发和竞态产生的原因 并发是操作系统编程中的核心问题之一。我们必须要能解决对共享资源的并发访问。 并发产生资源...

  • 【2020-02-24】leetcode 多线程

    多线程---并发 并发主要为多任务情况设计:竞态条件:由于多进程之间的竞争执行,导致程序未按照期望的顺序输出。死锁...

  • L14. 并发与竞态(自旋锁)

    简介 自旋锁: 它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的...

  • L11. 并发与竞态(原子操作)

    简介 "原子操作(atomic operation)是不需要synchronized",这是多线程编程的老生常谈了...

  • [读书笔记]并发和竞态(第五章)

    综述 并发问题是编程中经常遇到的难题,我们需要学会针对并发产生的竞态进行编程 一、信号量和互斥体 Linux上信号...

  • 【链安】竞态条件漏洞分析及详细修复建议

    什么是竞态条件 【竞态条件】竞态条件的官方定义是如果程序的执行顺序改变会影响结果,它就属于一个竞态条件。在智能合约...

网友评论

    本文标题:并发与竞态

    本文链接:https://www.haomeiwen.com/subject/vjshectx.html