V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nebkad
V2EX  ›  编程

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

  •  
  •   nebkad · 275 天前 · 444 次点击
    这是一个创建于 275 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    nebkad
        1
    nebkad  
    OP
       275 天前
    谁能想到呢,写个 spinlock 都需要引入分布式算法。

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

    先说 1 受控取消
    取消者要设置标记,然后把自己的 ticket number N 放在 atomic_int 里面,才可以安全退出,
    然后 ticket number 是 N + 1 的等待者检测到这个变化,也把 N + 1 防盗 atomic_int 里面,继续等待。
    如此类推,就可以顺利地把所有等待者都顺利更新 ticket 。
    第 n 个受影响的等待者会发现自己更新之后,N + n 一直不会变,那么他来负责清除这个受控取消状态的标记。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3309 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:57 · PVG 19:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.