1. /*
  2. * These are the generic versions of the spinlocks and read-write
  3. * locks..
  4. *///自旋锁加锁,irqsave表示把标志寄存器存储起来
  5. #define spin_lock_irqsave(lock, flags) do { local_irq_save(flags);//关闭本地中断,保存标志位 spin_lock(lock); } while (0)
  6. #define spin_lock_irq(lock) do { local_irq_disable(); spin_lock(lock); } while (0)
  7. #define spin_lock_bh(lock) do { local_bh_disable(); spin_lock(lock); } while (0)
  8. //读锁与下面写锁,构成读写锁
  9. #define read_lock_irqsave(lock, flags) do { local_irq_save(flags); read_lock(lock); } while (0)
  10. #define read_lock_irq(lock) do { local_irq_disable(); read_lock(lock); } while (0)
  11. #define read_lock_bh(lock) do { local_bh_disable(); read_lock(lock); } while (0)
  12. //写锁,与上面构成读写锁
  13. #define write_lock_irqsave(lock, flags) do { local_irq_save(flags); write_lock(lock); } while (0)
  14. #define write_lock_irq(lock) do { local_irq_disable(); write_lock(lock); } while (0)
  15. #define write_lock_bh(lock) do { local_bh_disable(); write_lock(lock); } while (0)
  16. //自旋锁解锁
  17. #define spin_unlock_irqrestore(lock, flags) do { spin_unlock(lock); local_irq_restore(flags); } while (0)
  18. #define spin_unlock_irq(lock) do { spin_unlock(lock); local_irq_enable(); } while (0)
  19. #define spin_unlock_bh(lock) do { spin_unlock(lock); local_bh_enable(); } while (0)
  20. //读锁解锁
  21. #define read_unlock_irqrestore(lock, flags) do { read_unlock(lock); local_irq_restore(flags); } while (0)
  22. #define read_unlock_irq(lock) do { read_unlock(lock); local_irq_enable(); } while (0)
  23. #define read_unlock_bh(lock) do { read_unlock(lock); local_bh_enable(); } while (0)
  24. //写锁解锁
  25. #define write_unlock_irqrestore(lock, flags) do { write_unlock(lock); local_irq_restore(flags); } while (0)
  26. #define write_unlock_irq(lock) do { write_unlock(lock); local_irq_enable(); } while (0)
  27. #define write_unlock_bh(lock) do { write_unlock(lock); local_bh_enable(); } while (0)


自旋锁加锁解析
  1. static inline void spin_lock(spinlock_t *lock)
  2. {
  3. #if SPINLOCK_DEBUG
  4. __label__ here;
  5. here:
  6. if (lock->magic != SPINLOCK_MAGIC) {//判断是否等于魔数
  7. printk("eip: %p\n", &&here);
  8. BUG();
  9. }
  10. #endif
  11. __asm__ __volatile__(
  12. spin_lock_string
  13. :"=m" (lock->lock) : : "memory");
  14. }
其中spin_lock_string为一个宏
  1. #define spin_lock_string \
  2. "\n1:\t" \
  3. "lock ; decb %0\n\t" \ //将lock->lock减1,指令带lock表示把总线锁住,禁止其他cpu访问
  4. "js 2f\n" \//不是非负数,直接进入临界区
  5. ".section .text.lock,\"ax\"\n" \
  6. "2:\t" \
  7. "cmpb $0,%0\n\t" \//如果-1结果为负数,那就循环检测
  8. "rep;nop\n\t" \
  9. "jle 2b\n\t" \//如果检测依旧是负数,跳转到2
  10. "jmp 1b\n" \//否则检测
  11. ".previous"


互斥锁,读写锁,条件变量,自旋锁(用于线程互斥)
信号量,文件锁用于进程同步


最新文章

  1. 机器学习——k-近邻算法
  2. openlayer 3 在layer上添加feature
  3. 练习1-23:删去C语言程序中所有的注释语句(C程序设计语言 第2版)
  4. mztree使用示例
  5. DIRECTORY_SEPARATOR 和 PATH_SEPARATOR的区别
  6. (转载)Android理解:显式和隐式Intent
  7. ecpilise引入Maven项目目录不正常,无JRE,无Maven Dependencies
  8. HttpServletRequestWrapper的使用
  9. 【转】分享10VPN
  10. 转载:C++ map的基本操作和使用
  11. AJax的异步请求
  12. corosync集群的选举算法
  13. java web--DOM
  14. cpu_ops、suspend_ops、arm_idle_driver以及machine_restart/machine_power_off到底层PSCI Firmware分析
  15. java_25.1字节转为字符OutputStreamWriter
  16. c++注意易错点
  17. tcp黏包
  18. Lock和Condition在JDK中ArrayBlockingQueue的应用
  19. python基础4文件操作
  20. 【本地服务器】windows下nginx安装操作教程

热门文章

  1. js禁止微信浏览器下拉显示黑底查看网址
  2. 绘制文字:imagettftext()
  3. kali下将Python2.x切换至Python3.x
  4. requests.exceptions.SSLError……Max retries exceeded with url错误求助!!!
  5. 借助FreeHttp为任意移动端web网页添加vConsole调试
  6. 非负矩阵分解(NMF)原理及算法实现
  7. DEDE调用指定文章ID来调用特定文档
  8. Jquery 实现层的拖动,支持回调函数
  9. 8、HTML DOM总结
  10. 替换掉 in的like操作