无锁序列系列笔记

下面是常见的一些实现方式:

1、借助智能指针来实现。下面是一篇参考博文

2、借助automic使用CAS(Compare And Swap)原子操作,

        std::atomic_flag,不同于所有 std::atomic 的特化,它保证是免锁的,不提供load()与store(val)操作,但提供了test_and_set()与clear()操作,其中test_and_set()就是支持RMW的原子操作,可用std::atomic_flag实现自旋锁的功能

//atomic2.cpp 使用原子布尔类型实现自旋锁的功能#include <thread>
#include <vector>
#include <iostream>
#include <atomic>std::atomic_flag lock = ATOMIC_FLAG_INIT;       //初始化原子布尔类型void f(int n)
{for (int cnt = 0; cnt < 100; ++cnt) {while (lock.test_and_set(std::memory_order_acquire))  // 获得锁; // 自旋std::cout << n << " thread Output: " << cnt << '\n';lock.clear(std::memory_order_release);               // 释放锁}
}int main()
{std::vector<std::thread> v;     //实例化一个元素类型为std::thread的向量for (int n = 0; n < 10; ++n) {v.emplace_back(f, n);       //以参数(f,n)为初值的元素放到向量末尾,相当于启动新线程f(n)}for (auto& t : v) {     //遍历向量v中的元素,基于范围的for循环,auto&自动推导变量类型并引用指针指向的内容t.join();           //阻塞主线程直至子线程执行完毕}getchar();return 0;
}

更复杂的数据结构(自定义数据结构)实现五锁化其实只是将颗粒度变小,在最低颗粒度上还是有锁操作,下面是基于CAS实现的一个无锁栈:

//atomic3.cpp 使用CAS操作实现一个无锁栈#include <atomic>
#include <iostream>template<typename T>
class lock_free_stack
{
private:struct node{T data;node* next;node(const T& data) : data(data), next(nullptr) {}};std::atomic<node*> head;public:lock_free_stack(): head(nullptr) {}void push(const T& data){node* new_node = new node(data);do{new_node->next = head.load();   //将 head 的当前值放入new_node->next}while(!head.compare_exchange_strong(new_node->next, new_node));// 如果新元素new_node的next和栈顶head一样,证明在你之前没人操作它,使用新元素替换栈顶退出即可;// 如果不一样,证明在你之前已经有人操作它,栈顶已发生改变,该函数会自动更新新元素的next值为改变后的栈顶;// 然后继续循环检测直到状态1成立退出;}T pop(){node* node;do{node = head.load();}while (node && !head.compare_exchange_strong(node, node->next));if(node) return node->data;}
};int main()
{lock_free_stack<int> s;s.push(1);s.push(2);s.push(3);std::cout << s.pop() << std::endl;std::cout << s.pop() << std::endl;getchar();return 0;
}

引用:

博文具有很大的学习价值:https://github.com/guevara/read-it-later/issues/9642

扩展:

1、自旋锁和互斥锁两者都确保某一时刻只有一个线程可访问资源,不过互斥锁会让其它线程进入休眠状态,而自旋锁会一直循环检测。自旋锁多用于多核处理器下

2、尝试在无锁编程中实现无阻塞,有很多技术可以实现,比如原子操作、内存屏障、避免ABA问题等的。

3、在x86/64平台上,不能保证大于8字节的Read/Write是原子操作,这意味着流式处理SIMD扩展寄存器和字符串操作16字节Read/Write可能不是原子操作。

        不自然对齐类型的Read/Write(如写入跨越4字节边界的DWORD)不能保证是原子的。CPU可能必须以多个总线事物的形式执行这些读取和写入,这可能允许另一个线程修改或Read/Write中间的数据。

        复合操作不是原子操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

itextpdf使用:使用PdfReader添加图片水印

gitee参考代码地址&#xff1a;https://gitee.com/wangtianwen1996/cento-practice/tree/master/src/test/java/com/xiaobai/itextpdf 参考文章&#xff1a;https://www.cnblogs.com/wuxu/p/17371780.html 1、生成带有文字的图片 使用java.awt包的相关类生成带文字的图片&…

keil调试出现cannot evaluate新思路

我在用最新的keil时也出现了这个问题&#xff0c;网上说的办法几乎没啥用&#xff0c;包括魔术棒的设置和将变量定义为全局变量&#xff0c;都没用。 这里我使用的是keil5.13&#xff0c;编译器是AC6.21&#xff0c;硬件是STM32F407VET6 可以看到&#xff0c;即使是定义为全局变…

问题:超声波纵波斜入射时,当入射角大于第一临界角小于第二临界角时,在第二介质内只有折射横波。 #微信#经验分享#其他

问题&#xff1a;超声波纵波斜入射时&#xff0c;当入射角大于第一临界角小于第二临界角时&#xff0c;在第二介质内只有折射横波。 参考答案如图所示

QT - 嵌入式快速移植QT记录

QT快速移植指南 本指南旨在提供一个关于如何为特定目标平台快速移植QT应用程序的详细步骤说明。以下内容包含技术背景、配置步骤以及相关命令&#xff0c;帮助开发者有效地将QT应用部署在不同的硬件平台上。 技术背景 QT是一个跨平台的C图形用户界面应用程序开发框架&#x…

力扣94-二叉树的中序遍历

二叉树的中序遍历 题目链接 解题思路 递归解决先遍历左子树访问根节点再遍历右子树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

对于模糊查询的SQL,怎么优先返回等值记录

说明&#xff1a;记录一次SQL改进的方法&#xff0c;希望能对大家有启发。 场景 前端项目有一个输入框&#xff0c;根据输入的银行名称&#xff0c;去模糊查询对应的数据库表&#xff0c;返回结果集&#xff0c;显示到下拉列表中。 因为银行名称字段包括了分行名&#xff0c…

缓存穿透、缓存击穿与缓存雪崩

缓存穿透、缓存击穿与缓存雪崩 1.本质区别 缓存穿透指的是数据库不存在数据&#xff0c;导致无法缓存&#xff0c;每次查询都查数据库&#xff0c;数据库压垮 缓存击穿指的是缓存键值对key过期了&#xff0c;key过期期间&#xff0c;大量请求访问&#xff0c;不经过缓存&…

ONLYOFFICE桌面编辑器8.0新特性:PDF表单、RTL支持、Moodle集成、本地界面主题等

ONLYOFFICE是由领先的IT公司—Ascensio System SIA经验丰富的IT专家开发的项目。这是一款强大的在线编辑器&#xff0c;能够为提供高效的文本文档、电子表格、演示文稿、表单和 PDF 编辑工具。 继 ONLYOFFICE 文档 v8.0发布后&#xff0c;适用于 Linux、Windows 和 macOS 的免费…

C++中类的6个默认成员函数【构造函数】 【析构函数】

文章目录 前言构造函数构造函数的概念构造函数的特性 析构函数 前言 在学习C我们必须要掌握的6个默认成员函数&#xff0c;接下来本文讲解2个默认成员函数 构造函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c…

电商网站基础布局——以小兔鲜为例

项目准备 /* base.css */ /* 內减模式 */ * {margin: 0;padding: 0;box-sizing: border-box; }/* 设置网页统一的字体大小、行高、字体系列相关属性 */ body {font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, "Microsoft Yahei","Hiragino Sans…

【WPF】布局容器/面板总结XAML-Panel控件

Panel元素是控制元素呈现&#xff08;大小、尺寸、位置、字内容排列&#xff09;的组件。 常用布局容器 Grid 用于创建网格区域&#xff08;行列&#xff09; // 在Grid里面使用 //定义列的数量 <Grid.ColumnDefinitions><ColumnDefinition /> </Grid.Colum…

Codeforces Round 106 D. Coloring Brackets 【区间DP + 记忆化搜索实现】

D. Coloring Brackets 约定 ∣ S ∣ ≤ 700 |S| \leq 700 ∣S∣≤700 题意 给定一个正则括号序列 s s s&#xff0c;我们需要求出合法的染色方案数。合法的条件为&#xff1a; 每个符号要么不染色&#xff0c;要么染红色&#xff0c;要么染蓝色对于每对配对的括号&#xf…

(十八)springboot实战——spring securtity注解方式的授权流程源码解析

前言 在上一节内容中&#xff0c;我们介绍了如何在FilterSecurityInterceptor过滤器中处理用户的授权流程&#xff0c;并分析了其源码&#xff0c;spring security还提供了方法级别的授权方式&#xff0c;通过EnableMethodSecurity注解启用权限认证流程&#xff0c;只需要在方…

Ivanti Pulse Connect Secure VPN SSRF(CVE-2023-46805)漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Failed to construct ‘RTCIceCandidate‘ sdpMid and sdpMLineIndex are both null

最近在搞webrtc&#xff0c;在编写函数处理远端传递来的candidate时报错了&#xff0c;具体信息如下。国内关于webrtc的资料很少&#xff0c;所以去国外社区转了一圈&#xff0c;回来记录一下报错的解决方案 其实这个bug也好解决&#xff0c;根据报错信息可以判断是RTCIceCand…

Java 学习和实践笔记(5)

三种类型的变量&#xff1a; Java中常量的定义&#xff1a; 下面的这个加号表示连接的意思&#xff0c;也就是把前面的字符串常量和后面的变量值在显示时连在一起&#xff1a; 显示效果如下&#xff1a; 如果没有用这个加号&#xff0c;就会报错&#xff1a;

微信小程序(四十)API的封装与调用

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.在单独的js文件中写js接口 2.以注册为全局wx的方式调用接口 源码&#xff1a; utils/testAPI.js const testAPI{/*** * param {*} title */simpleToast(title提示){//可传参&#xff0c;默认为‘提示’wx.sho…

前端 > JS 笔试题面试考题(11-15)

说明正则表达式给所有string对象添加去除首尾空白符的方法&#xff08;trim方法&#xff09; &#xff1f; 面试通过率&#xff1a;85.0% 推荐指数&#xff1a; ★★★ 试题难度&#xff1a; 初级 试题类型&#xff1a; 编程题 <script>Object.prototype.trim function…

【FPGA】Verilog:奇偶校验位发生器 | 奇偶校验位校验器

目录 0x00 奇偶校验位发生器 0x01 奇偶校验位校验器 0x02 错误检测器和纠错器

第三百一十七回

文章目录 1. 概念介绍2. 实现方法2.1 hintText2.2 labelText2.3 controller 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中处理光标"相关的内容&#xff0c;本章回中将介绍如何添加输入框默认值.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…