[抱怨] Ticket Based 的 Spinlock 很难支持取消争夺锁

80 天前
 nebkad

写了好长时间,但是废掉了,想不到办法,唉

如果有好办法的话请不吝赐教。

321 次点击
所在节点    编程
1 条回复
nebkad
79 天前
谁能想到呢,写个 spinlock 都需要引入分布式算法。

在极其有限的内存中(一个 int )挤出两个 bit 用来标记:1.受控取消争夺锁状态,2.有线程崩溃后的 非受控取消争夺锁状态。

先说 1 受控取消
取消者要设置标记,然后把自己的 ticket number N 放在 atomic_int 里面,才可以安全退出,
然后 ticket number 是 N + 1 的等待者检测到这个变化,也把 N + 1 防盗 atomic_int 里面,继续等待。
如此类推,就可以顺利地把所有等待者都顺利更新 ticket 。
第 n 个受影响的等待者会发现自己更新之后,N + n 一直不会变,那么他来负责清除这个受控取消状态的标记。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1016698

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX