自旋锁的极端猜想---大家来讨论下

nadleeh 2015-09-19 03:57:18
假设一台机器2个cpu2个线程1和2,2个相同的网卡。网卡分别对应线程1和线程2。
有段内存作为内存池,也就是共享数据区,由同一spinlock锁保护。

猜想就是:代码流程完全一样的情况下,2个cpu可能同时运行到加锁的代码的同一位置,问题来了,这时候spinlock以及cpu如何保证数据的独立性,谁加锁成功谁自旋?

这个问题有点纠结,以前猜想的是类似直接去内存去取锁需要的相关数据,因为cpu 再多对内存总线的持有总是唯一性的。但是貌似spin_lock锁效率不至于这么低下。




...全文
153 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-09-21
  • 打赏
  • 举报
回复
为什么不参考Linux下自旋锁相关源代码片断呢?
nadleeh 2015-09-21
  • 打赏
  • 举报
回复
引用 6 楼 JiangWenjie2014 的回复:
BTS指令常常和LOCK前缀配合成为一个原子指令。加锁用bts指令,然后加一个lock前缀,确保处理器独占共享内存。http://bbs.pediy.com/showthread.php?t=74502
引用 6 楼 JiangWenjie2014 的回复:
BTS指令常常和LOCK前缀配合成为一个原子指令。加锁用bts指令,然后加一个lock前缀,确保处理器独占共享内存。http://bbs.pediy.com/showthread.php?t=74502
基本上明了了,联想到x86 上高性能的mmu带来的快速cache 内存一致性,避免cpu 持有内存总线的过程过长,尽量去cache 取数据
lm_whales 2015-09-21
  • 打赏
  • 举报
回复
不可能同时 加锁的,这个请放心 这种代码会串行化的,所以必有先加与后加的
JiangWenjie2014 2015-09-20
  • 打赏
  • 举报
回复
BTS指令常常和LOCK前缀配合成为一个原子指令。加锁用bts指令,然后加一个lock前缀,确保处理器独占共享内存。http://bbs.pediy.com/showthread.php?t=74502
Joseph_1118 2015-09-20
  • 打赏
  • 举报
回复
在没怎么看懂得情况下,回复一下。 spinlock底层就是一块内存,其中存储着0或者1,来表明这个锁是否有人持有。读取并判断是否为1的操作是一个原子操作。拿不到锁的就自旋,并不停得去执行那个原子操作。
yajuie 2015-09-20
  • 打赏
  • 举报
回复
这个得留个言,回头来看
nadleeh 2015-09-19
  • 打赏
  • 举报
回复
引用 2 楼 dustpg 的回复:
自旋锁状态切换时原子操作吧,也就是说随机的? 看看其他人怎么说.
源码上的确是原子的,能够保证cache 和内存一致. 但谁获取锁,谁自旋这个问题还是无解啊
dustpg 2015-09-19
  • 打赏
  • 举报
回复
自旋锁状态切换时原子操作吧,也就是说随机的? 看看其他人怎么说.
nadleeh 2015-09-19
  • 打赏
  • 举报
回复
有问题尽管提 有错误尽管指出

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧