1、拿锁需要原子操作,因为多线程情况下有可能不同cpu同时想要拿到同一把锁,这种情况的就需要原子操作,riscv里使用amoswap指令来完成
这里是说如果按照这种流程走,会有线程同时看到locked等于0,然后加锁。这之间的切换会导致冲突,所以我们要在硬件层面约束,来做这种对锁的"test - set",
对应到c库里面就是这种
对应到汇编层面也可以看到如果没有加锁成功就一直循环。
2、然后是指令的顺序问题,指令不一定是按照c代码逻辑走,所以避免因为指令重排的错误情况,对应c库使用的是_sync_synchronize();这个函数保证c代码层面上前后的load和store顺序不会被颠倒,好像是对应了riscv中的fence指令
顺带一点视频里说拿到锁就关闭中断,解放锁就起开,说是中断处理程序也可能要拿和当前被中断进程一样的锁,如果这也的话中断就拿不到锁就会panic了。