美文网首页
spin lock实现

spin lock实现

作者: 谭英智 | 来源:发表于2023-11-02 21:42 被阅读0次

    简介

    对于短时间的locking,spin lock可以提供更好的性能,对比mutex lock。
    因为spin lock不会让线程陷于睡眠,从而提供更好的性能

    实现过程

    一个低性能的的spin lock实现

    struct tas_lock {
      std::atomic<bool> lock_ = {false};
    
      void lock() { while(lock_.exchange(true)); }
    
      void unlock() { lock_.store(false); }
    };
    

    缺点:

    • 使用了atomic默认的memory order:seq。开销太大

    使用正确的memory order

    struct tas_lock {
      std::atomic<bool> lock_ = {false};
    
      void lock() { while(lock_.exchange(true, std::memory_order_acquire)); }
    
      void unlock() { lock_.store(false, std::memory_order_release); }
    };
    

    缺点:

    每次判定是否lock都需要cas。导致开销大

    在其他线程没有释放锁的时候,去lock,会不断的使用cas,而这并不是必要的

    通过atomic read来先预判是否lock

    struct ttas_lock {
      ...
      void lock() {
        for (;;) {
          if (!lock_.exchange(true, std::memory_order_acquire)) {
            break;
          }
          while (lock_.load(std::memory_order_relaxed));
        }
      }
      ...
    };
    

    缺点:

    • 在发现已经上锁后,不断的去读lock的状态,导致消耗cpu资源

    如果发现已经上锁了,通过pause cpu来减少spin的开销

    struct ttas_lock {
      ...
      void lock() {
        for (;;) {
          if (!lock_.exchange(true, std::memory_order_acquire)) {
            break;
          }
          while (lock_.load(std::memory_order_relaxed)) {
            __builtin_ia32_pause();
          }
        }
      }
      ...
    };
    

    相关文章

      网友评论

          本文标题:spin lock实现

          本文链接:https://www.haomeiwen.com/subject/olinidtx.html