2019独角兽企业重金招聘Python工程师标准>>>

自旋锁 通过cas操作,在大部分情况下可以实现比std::mutex 更高的性能

基本思想是通过原子操作去尝试获取变量的值 所有线程去竞争 该原子变量

性能:

无竞争情况下

1.spin_lock 16000W 次每秒

2.mutex 2800W次每秒

3.std::atomic<int> 24100W 次每秒

可见 自旋锁性能挺高的

5个线程竞争情况下

1.spin_lock 717W 每秒

2.mutex 509W 每秒

3.atomic<int>  5900W 每秒

高竞争情况下 还是比mutex 性能高

贴上代码

调整原子操作的内存顺序 可以再次加强性能,暂时用默认方式处理把

/*
Email me@dreamyouxi.com自旋锁*/
#pragma  once
#include <atomic>
#include <thread>
#include <chrono>//cas
class spin_lock
{
private:std::atomic<bool> _internal_tag = false;
private:spin_lock(const spin_lock &) = delete;spin_lock& operator = (const spin_lock&) = delete;
public:void lock();void unlock();
};class spin_lock_guard
{spin_lock & locker;// ref
public:spin_lock_guard(spin_lock& lock);~spin_lock_guard();
};
#include "util/log.h"
#include "concurrency/spin_lock.h"
const char LOG_NAME[] = "spin_lock";
using namespace  std;void spin_lock::lock()
{bool except = false;int times = 0;//fast passwhile (true){if (_internal_tag.compare_exchange_strong(except, true, std::memory_order_seq_cst)){//ok got itreturn;}if (++times > 4000){//break;}except = false;}times = 0;//slow passwhile (true){if (_internal_tag.compare_exchange_strong(except, true, std::memory_order_seq_cst)){//ok got itreturn;}if (++times < 1000){//this_thread::yield();}else{break;}except = false;}// //very slow passwhile (true){if (_internal_tag.compare_exchange_strong(except, true, std::memory_order_seq_cst)){//ok got itreturn;}except = false;//内存延时 6代E5 大概是100纳秒一个周期//mutex 无竞争情况下 性能大概是每秒300W 次 即 0.3微秒 300纳秒//sleep_for 进度在win平台好像最小是1MS 因此这里的设定也许有BUGthis_thread::sleep_for(std::chrono::nanoseconds(300));}
}void  spin_lock::unlock()
{_internal_tag.store(false, std::memory_order_seq_cst);
}spin_lock_guard::spin_lock_guard(spin_lock& lock) :
locker(lock)
{locker.lock();
}spin_lock_guard::~spin_lock_guard()
{locker.unlock();
}

最高性能版本

/*
Email me@dreamyouxi.com自旋锁*/
#pragma  once
#include <atomic>
#include <thread>
#include <chrono>//cas
class spin_lock
{std::atomic_flag locker = ATOMIC_FLAG_INIT;  // NOLINT
public:spin_lock(const spin_lock &) = delete;spin_lock& operator = (const spin_lock&) = delete;spin_lock() = default;void unlock(){locker.clear(std::memory_order_release);}void lock();
private:bool try_lock(){bool ok = locker.test_and_set(std::memory_order_acquire);return !ok;}
};class spin_lock_guard
{spin_lock & locker;// ref
public:spin_lock_guard(spin_lock& lock);~spin_lock_guard();
};#include "util/log.h"
#include "concurrency/spin_lock.h"
const char LOG_NAME[] = "spin_lock";
using namespace  std;void spin_lock::lock()
{int times = 0;//fast passwhile (true){if (try_lock()){//ok got itreturn;}if (++times > 4000){//break;}}times = 0;//slow passwhile (true){if (try_lock()){//ok got itreturn;}if (++times < 1000){//this_thread::yield();}else{break;}}// //very slow passwhile (true){if (try_lock()){//ok got itreturn;}//内存延时 6代E5 大概是100纳秒一个周期//mutex 无竞争情况下 性能大概是每秒300W 次 即 0.3微秒 300纳秒//sleep_for 进度在win平台好像最小是1MS 因此这里的设定也许有BUGthis_thread::sleep_for(std::chrono::nanoseconds(300));}
}spin_lock_guard::spin_lock_guard(spin_lock& lock) :
locker(lock)
{locker.lock();
}spin_lock_guard::~spin_lock_guard()
{locker.unlock();
}

转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/2221516

spin lock自旋锁相关推荐

  1. 自旋锁和互斥锁的区别 java中lock Syntronized区别

    转载自:http://blog.csdn.net/susidian/article/details/51068858 自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠 ...

  2. linux进程--自旋锁和互斥锁的区别(十四)

    自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋&qu ...

  3. linux进程--自旋锁和互斥锁的区别(十五)

    POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多 ...

  4. 【Linux 多线程】自旋锁与互斥锁区别

    POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多 ...

  5. 自旋锁和互斥锁的区别

    自旋锁和互斥锁的区别 POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁 ...

  6. Spin lock 与mutex 的区别--2011.01.06

    POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...

  7. 自旋锁与互斥锁的区别

    自旋锁和互斥锁的区别 POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁 ...

  8. Linux 内核同步(二):自旋锁(Spinlock)

    自旋锁 内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择: 一个是原地等待 一个是挂起当前进程,调度其他进程执行(睡眠) Spinlock 是内核中提供的一种比较常见的锁机制,自旋锁是&quo ...

  9. 信号量、互斥体和自旋锁

    一.信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信.本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况.一般说来,为了获 ...

最新文章

  1. python库怎么学啊最好_最常用的几个python库--学习引导
  2. 作业30-首页列表显示全部问答,完成问答详情页布局
  3. 指定locale为en_US
  4. DO280介绍红帽OPENSHIFT容器平台--管理OpenShift与课外补充
  5. JavaScript基础视频教程总结(011-020章)
  6. 构建一套完整高效的供应链系统体系
  7. FF300R08W2P2B11A 汽车用EasyPACK 模块 2 个独立式
  8. 回文日期 php,c语言程序实例大全,220个详细程序源代码
  9. 操作系统————应用题
  10. 华为临阵换帅,云市场掀起“三国杀”
  11. 关于SpringBoot如何返回视图
  12. Certificate Vending Machine – Amazon IoT 设备接入 Amazon IoT 平台解决方案
  13. android 图片格式 xvg,大势所趋,应用如何适配Android P HEIF图片格式
  14. Android 双屏异显
  15. 做网络必须掌握83句话
  16. 如何快速修改SQLite生成的.db文件(SQLite)
  17. emd分解详解一种自适应的数据处理或挖掘方法
  18. 计算机二级 word准靠证,计算机二级考试真题-Word-小郑-会计准考证
  19. 用机器学习生成披头士的歌词 | 项目实战
  20. 怎么制作升温曲线图_PCBA制造过程中几种典型的温度曲线

热门文章

  1. [Vue.js] 模块化 -- 前端模块化
  2. JavaScript算法【特殊篇】数组去重的十种实用方案
  3. jQuery中的事件机制与DOM操作
  4. LeetCode--32. 最长有效括号(栈)
  5. 搞不定的C语言--static的作用
  6. 7-237 有理数加法 (15 分)
  7. php 价格计算方法,PHP算法逻辑:如何计算购买量?
  8. 云服务器拷贝文件大小,如何从云服务器上拷贝大文件
  9. Spring Boot war方式打包发布
  10. 02、MySQL—数据库基本操作