spinlock内部一定要使用内存屏障技术
内存屏障总结
- 应用开发用到的锁/信号量等
粗粒度同步机制的内部实现- 肯定会用到内存屏障
- 例如自旋锁 ->
需要结合一个具体的实现仔细看一下- 都在自己的缓存中,lock_val = 0
- core 0 尝试获取,将lock_val的值写为1。接着执行关键代码
- 底层MESI协议开始起作用
- 但是有一定延迟
- 接着,core 1尝试获取,发现自己缓存中lock_val的值仍然为0,因此获取成功,也开始执行关键代码
- 可以看到这里两个core都进入了关键区
- 因此 core 0必须等待该写操作执行完成【
写到内存中/或者MESI同步完成】才可以继续执行后续的指令- 因此 core 1 必须在读之前确保拿到被修改后的变量【必须从内存中获取】;即一定要
使用内存屏障,确保这之前其它core做的修改均已写入到主存中 - 这样看来,这里两处等待只需要一处即可?❌如果只放在读取之前
- 如果 core 1的读取在core 0的写入之前/读取之后
- 接着两者都会尝试写
- 因此也要在写完成【即写进入了主存】之后才能进入关键区
- 因此 core 1 必须在读之前确保拿到被修改后的变量【必须从内存中获取】;即一定要
spinlock内部一定要使用内存屏障技术
http://example.com/2024/08/27/嵌入式-开发/spinlock内部一定要使用内存屏障技术/