美文网首页
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();
      }
    }
  }
  ...
};

相关文章

  • 多线程总结

    pthread_mutex_lock和pthread_spin_lock的区别: 从 实现原理上来讲,Mutex属...

  • spin_lock

    当性能测试出现下降,使用perf top监控,出现mt_spin_lock_wait超过5% 出现spin_loc...

  • ReentrantLock理解AQS同步队列的细节和设计模式

    Lock接口 Lock的实现 实现Lock接口的类有很多,以下为几个常见的锁实现 ReentrantLock:表示...

  • MySQL innodb锁

    MySQL自旋锁-spin lock 一篇算是介绍innodb锁比较有条理的文章 https://blog.csd...

  • 《Java concurrent包源码分析》二、可重入锁

    Lock接口: Lock接口是锁操作的基础,后面的所有的锁实现都会实现Lock接口。 最无赖的做法:lock(),...

  • Linux中的各种锁

    在Linux内核中,有很多同步机制。比较经典的有原子操作、spin_lock(忙等待的锁)、mutex(互斥锁)、...

  • 04ReentrantLock锁

    概述 介绍java并发包中的Lock锁的基本使用与实现细节。 1 Lock接口 lock锁可以实现和synchro...

  • ReentantLock核心代码

    Lock接口 Reentrant实现了Lock接口,Lock接口主要定义了如下几个方法: ReentrantLoc...

  • 线程同步

    1、synchronized 单例模式下synchronized实现同步 2、lock 单例模式下lock实现同步...

  • iOS中各种锁的性能对比

    自旋锁 与 互斥锁 自旋锁 (spin lock): 如果一个线程需要获取自旋锁,该锁已经被其他线程占用,该线程不...

网友评论

      本文标题:spin lock实现

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