spin lock自旋锁
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自旋锁相关推荐
- 自旋锁和互斥锁的区别 java中lock Syntronized区别
转载自:http://blog.csdn.net/susidian/article/details/51068858 自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠 ...
- linux进程--自旋锁和互斥锁的区别(十四)
自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋&qu ...
- linux进程--自旋锁和互斥锁的区别(十五)
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多 ...
- 【Linux 多线程】自旋锁与互斥锁区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多 ...
- 自旋锁和互斥锁的区别
自旋锁和互斥锁的区别 POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁 ...
- Spin lock 与mutex 的区别--2011.01.06
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...
- 自旋锁与互斥锁的区别
自旋锁和互斥锁的区别 POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁 ...
- Linux 内核同步(二):自旋锁(Spinlock)
自旋锁 内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择: 一个是原地等待 一个是挂起当前进程,调度其他进程执行(睡眠) Spinlock 是内核中提供的一种比较常见的锁机制,自旋锁是&quo ...
- 信号量、互斥体和自旋锁
一.信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信.本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况.一般说来,为了获 ...
最新文章
- python库怎么学啊最好_最常用的几个python库--学习引导
- 作业30-首页列表显示全部问答,完成问答详情页布局
- 指定locale为en_US
- DO280介绍红帽OPENSHIFT容器平台--管理OpenShift与课外补充
- JavaScript基础视频教程总结(011-020章)
- 构建一套完整高效的供应链系统体系
- FF300R08W2P2B11A 汽车用EasyPACK 模块 2 个独立式
- 回文日期 php,c语言程序实例大全,220个详细程序源代码
- 操作系统————应用题
- 华为临阵换帅,云市场掀起“三国杀”
- 关于SpringBoot如何返回视图
- Certificate Vending Machine – Amazon IoT 设备接入 Amazon IoT 平台解决方案
- android 图片格式 xvg,大势所趋,应用如何适配Android P HEIF图片格式
- Android 双屏异显
- 做网络必须掌握83句话
- 如何快速修改SQLite生成的.db文件(SQLite)
- emd分解详解一种自适应的数据处理或挖掘方法
- 计算机二级 word准靠证,计算机二级考试真题-Word-小郑-会计准考证
- 用机器学习生成披头士的歌词 | 项目实战
- 怎么制作升温曲线图_PCBA制造过程中几种典型的温度曲线