V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
nebkad
V2EX  ›  编程

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

  •  
  •   nebkad · Feb 20, 2024 · 846 views
    This topic created in 799 days ago, the information mentioned may be changed or developed.

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

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

    nebkad
        1
    nebkad  
    OP
       Feb 20, 2024
    谁能想到呢,写个 spinlock 都需要引入分布式算法。

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

    先说 1 受控取消
    取消者要设置标记,然后把自己的 ticket number N 放在 atomic_int 里面,才可以安全退出,
    然后 ticket number 是 N + 1 的等待者检测到这个变化,也把 N + 1 防盗 atomic_int 里面,继续等待。
    如此类推,就可以顺利地把所有等待者都顺利更新 ticket 。
    第 n 个受影响的等待者会发现自己更新之后,N + n 一直不会变,那么他来负责清除这个受控取消状态的标记。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4617 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:01 · PVG 18:01 · LAX 03:01 · JFK 06:01
    ♥ Do have faith in what you're doing.