使用Epoch-Based Reclamation(EBR,特定域回收的一种方法)修改 lazy-list

article/2025/8/27 12:40:15

如前文所说,lazy-list最大的隐患莫过于逻辑删除,而没有物理删除问题,因此EBR首先就把这个问题给他solve了。

一.EBR修改部分

int parse_delete(intset_l_t *set, val_t val) {node_l_t *pred, *curr;int result, validated, isVal;while(1) {//Initpred = set->head;curr = get_unmarked_ref(pred->next);//Unmark and lock each nodewhile (curr->val < val) {pred = curr;curr = get_unmarked_ref(curr->next);}LOCK(&pred->lock);LOCK(&curr->lock);
/*
* Mark Phase: 
* Start from the root set to find all memory block references, and then mark the referenced memory block (mark)
*///check its validated and curr->val whether equals valvalidated = parse_validate(pred, curr);isVal = val == curr->val;result = validated && isVal;//only meeting at same time, make pred->next = newnodeif (result) {curr->next = get_marked_ref(curr->next);pred->next = get_unmarked_ref(curr->next);}//UNLOCK curr and predUNLOCK(&curr->lock);UNLOCK(&pred->lock);
/*
* Sweep Phase:
* All memory blocks that are not marked are considered garbage and can be recycled
*///find memory blocks that are not marked, setting a mark bit to 1result = result && parse_find(curr,isVal);//wait until pred and curr meet the validate conditions, exit this loopif(validated){//free the elementfree(curr);return result;}}
}

二.前后性能比较

original:
在这里插入图片描述
unsafe:
在这里插入图片描述
原始版实现2个线程完成从1到10个读数,而不安全的版本是5个线程拿到50个作业,终端显示时间几乎一样。

与以前相比,现有性能具有以下优点。

首先,程序的效率大大提高,真正发挥多核CPU的优势,达到充分利用CPU的目的。 然后,它可以防止阻塞并促进整个程序模型的建立。 非常适合多个相同线程处理同一个资源的情况。 并且,同步收集比以前得多,也更灵活

三.构建人工环境体现不安全性

前面都说了,改之后是不安全版本,那么不安全在哪呢?
counting时,单线程可能正确,但多线程错误
因为多线程操作只会看到它当前的线程情况,所以改变变量的顺序是不固定的。
这里用java多线程的方式来展现下结果

public class jthread {public static void main(String[] args) {//Test 3 people in multithread conditionWebTickets w = new WebTickets();Thread t = new Thread(w,"Alan");t.start();Thread t1 = new Thread(w,"Mike");t1.start();Thread t2 = new Thread(w,"Jay");t2.start();}}class WebTickets extends Thread{private int ticketNums = 99;// from ticket = 99 to 0, 3 people buy these ticketspublic void run(){while(true) {//when ticket<=0, stopif(ticketNums<=0) {break;}try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}//sout the consquenceSystem.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);}}
}

在这里插入图片描述
如图,java编写的抢票小程序,最后无法停下,抢到0以下的票。

所以实现同步机制需要注意以下几点: 安全性高,性能低,多线程使用。 高性能,低安全性,用于单线程

  1. 不要同步线程安全类的所有方法,只同步那些会改变共享资源的方法。
class WebTickets implements Runnable{//create static keystatic Object str = "str"; //Random valueprivate int ticketNums = 99;// from ticket = 99 to 0, 3 people buy these tickets@Overridepublic void run(){while(true) {//when ticket<=0, stopsynchronized(str){ //use lockif(ticketNums<=0) {break;}try {Thread.sleep(200);//rest 0.2 seconds} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);}}}
}

2、如果变量类有两种运行环境,在线程环境和多线程环境下,变量类应该有两个版本:线程安全版本和线程不安全版本(不带同步方法和同步块)。 在单线程环境下,使用线程不安全版本保证性能,多线程使用线程安全版本。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/cVIviMvC.shtml

相关文章

淘宝电商搜索EBR算法笔记

淘宝电商搜索EBR算法笔记 - 知乎《Embedding-based Product Retrieval in Taobao Search》介绍了淘宝目前最新的EBR算法。仍然是一个双塔的结构&#xff0c;query/user一个塔&#xff0c;item一个塔&#xff0c;各自得到向量表示&#xff0c;然后计算内积。 网络结构如上图所示…

解决西门子ebr设备模块更新报错,EQP_STATEVALUE more than one row

问题排查报告 原文来至 问题跟踪 首先定位到EQP_STATEVALUE表&#xff0c;发现数据出现重复&#xff1a; 执行语句取出所有非重复数据&#xff1a; select t.stateid,t.fk_statelistcst,t.code,t.label,t.functionid,t.pk_id,t.dlu,t.dluunit,t.cpt,t.haseqpimpact from EQP…

机械臂关节模组制动相关(零差云控eBr)

目录 前言一、电磁插销式抱闸1.原理2.特点 二、电磁摩擦片式制动器1.原理2.特点 三、零差云控电磁摩擦片式制动器&#xff08;eBreaker&#xff09;1.简介2.使用说明需要注意的事情3.接线 总结参考文献 前言 现阶段机械臂的制动方法主要有两种&#xff0c;一种是电磁插销式抱闸…

西门子EBR与BATCH通讯方法,mes与batch交互

最新更新请访问&#xff1a;mesebr.com 链接 1 前期准备 1.1 网络检查 两台服务器防火墙全部关闭&#xff1b;两台服务器之间可以相互ping同&#xff0c;若batch服务器连接oracle数据库的连接名称写的机器名&#xff0c;则batch服务器ping机器名也要可以ping通&#xff1b; 1…

WinHex数据恢复笔记-数据恢复与硬件维护-MBR格式--MBR,EBR系统结构

MBR&#xff0c;EBR系统结构 MBR限制2TB&#xff0c;最多有4个逻辑分区—如果有扩展&#xff08;3个主分区和1个扩展分区&#xff09; FAT32不能在大于32GB的盘上添加 MBR指向第一个EBR 第一个EBR(以链表)指向第二个EBR(以链表)指向第二个EBR(以链表)… MBR MBR数据结构 4…

西门子MES软件ebr脚本使用说明-SIMATIC IT EBR(Opcenter Execution Pharma

最新更新发布在此处 ebr脚本常用函数 ###参数输入输出 输入的type选择tag value;输出的type选择tag NAME; 实例 mData.InsertData ousNAME,0,straaa 输出文本 mData.InsertData ousAGE,1,age 输出数字html直接输出 mRecordText.WriteHTML str_htmlr 可直接输出html内…

每周一文(六)Facebook EBR向量召回模型

契机 从样本和模型两方面来介绍向量级别召回模型的由来。提出很有建设性的工业级别的参考价值。 样本角度 有监督的二分类模型需要构建正负样本&#xff0c;正样本的选择不管是召回和排序来说都是一致的&#xff0c;即用户有显式的点击行为的样本为正样本。而对于召回模型(甚…

主引导记录(MBR)、硬盘分区表(DPT)、扩展引导记录(EBR)

前言 最近在研究使用grub引导自制操作系统时&#xff0c;发现grub链式引导过程中向boot传递的硬盘分区表表项数据有疑问&#xff0c;特此记录下。 一、主引导记录&#xff08;MBR&#xff09; MBR是存储在计算机硬盘的第一个物理扇区的512字节的数据块&#xff0c;它包含了引…

MES管理端介绍,ebr二次开发产品—SIMATIC IT EBR(Opcenter Execution Pharma)

原文来至&#xff1a;访问原文 西门子MES软件ebr功能很强大&#xff0c;但给用户若只想查看一些数据是非常不方便&#xff0c;对外接口提供的文档也不具体&#xff0c;所以我二次开发了EBR的管理端。 主要功能 权限管理物料管理工单管理族谱批记录查看报表与看板审计追踪记录 …

NTFS文件系统详解(二)MBR\EBR基本信息

NTFS文件系统详解&#xff08;二&#xff09;MBR\EBR基本信息 一、MBR结构分析1. 第一个分区表项2. 第二个分区表项3. 第三个分区表项4. 第四个分区表项 二、EBR结构分析1. 第一个分区表项2. 第二个分区表项2.1 第一个分区表项2.2 第二个分区表项2.3 第三个分区表项 NTFS文件系…

MBR、EBR与DBR详解

demo&#xff1a;https://github.com/Hilaver/NtfsResolution/ 先看一张硬盘图片&#xff08;一个盘面&#xff09;&#xff1a; MBR 主引导记录&#xff08;MBR&#xff0c;Main Boot Record&#xff09;是位于磁盘最前边的一段引导&#xff08;Loader&#xff09;代码。它负…

MBR、EBR、DBR是什么

通常情况下可以这样描述这几个概念&#xff1a; MBR&#xff1a;为计算机启动后从可启动介质上首先装入内存并且执行的代码&#xff0c;通常用来解释分区结构。以硬盘为例&#xff0c;通常为LBA的0扇区。 EBR:自MICROSOFT推出扩展分区的概念后&#xff0c;扩展分区就沿用了基本…

NTFS文件系统详解(二)之MBR(EBR)基本信息

经过上一篇文章对硬盘的基本结构的详细介绍后,我们再来看看MBR和EBR的结构 MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区。不过,在总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外的64个字节交给了 DPT(Disk Partition Table硬盘分区表…

EBR内容解析

原先博客放弃使用,几篇文章搬运过来 EBR(Extended Boot Record)即扩展分区引导记录.类似于主引导记录MBR.因为MBR的四条分区信息的限制,可以使用EBR方便扩展. 它的结构与MBR类似于,但是没有引导程序和磁盘签名,仅仅保留了分区表和结束标志. 下面以实例分析: 新建一个512MB虚拟…

C++中常见的几种输入字符串的方法

C中常见的几种输入字符串的方法_是赵薰薰呀的博客-CSDN博客_c输入字符串 可以用的函数 substr substr有2种用法&#xff1a; 假设&#xff1a;string s "0123456789"; string sub1 s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾&#xff1a;sub1 &…

MATLAB-字符串

本节我们学习如何在MATLAB中创建一个字符串。 例如&#xff1a; my_string 搬砖工程师domi MATLAB执行上述语句&#xff0c;返回以下结果&#xff1a; my_string 搬砖工程师domi MATLAB 认为所有变量&#xff0c;数组和字符串被视为字符数组。 让我们使用命令检查上面创建…

c语言:动态输入字符串数组

考研题中经常会遇到给定一条英文句子&#xff0c;让我们对其每个单词进行操作&#xff0c;不同于对整型数据操作&#xff0c;字符串在c语言中必须存放到数组中&#xff0c;无形之中又给考题增加了难度 一般情况下&#xff0c;字符串数组都以二维数组或指针数组定义&#xff0c…

用scanf_s输入字符串

用的是vs2019。 为了安全&#xff0c;scanf_s输入字符串时需要加一个数字来限制最多读取的字符数。 错误示例&#xff1a; char* str[100]; scanf_s("%s",str);这样写编译器没有报错&#xff0c;但是运行会出错&#xff0c;debug显示 正确写法&#xff1a; char…

写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。 解题思路&#xff1a; 字符串以\0作为结尾&#xff0c;则从第一个字符开始向后移动遇到\0认为字符串结束。 答案&#xff1a; #include <stdio.h> int mystrlen(char *str) {int len 0;char *pt…

C++输入字符串的几种方式

最近有复习到 C 基础知识&#xff0c;这里总结下在 C 中输入字符串的几种方式&#xff0c;有需要的可以参考&#xff1a; 1、cin >> <1> 输入一个数字 void Cin1() {int a, b;cin >> a >> b;cout << "a b " << a b <&l…