spin lock实现

2023-11-02  本文已影响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); }
};

缺点:

使用正确的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));
    }
  }
  ...
};

缺点:

如果发现已经上锁了,通过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();
      }
    }
  }
  ...
};
上一篇下一篇

猜你喜欢

热点阅读