一、Delphi的原子操作函数

在System.SyncObjs单元中,有一个TInterlocked的密封类,其十多个类函数(class function)其实都是调用的System单元的原子操作函数,只是封装得更容易理解。

使用方法:如对一个数值加一,则直接b:= TInterlocked.Increment(a);或TInterlocked.Increment(a);,不用创建TInterlocked类(类函数相当于就是单独的函数,可以直接调用,不用实例化对象)

1、对一个数值变量加一和减一操作

//实际是调用System单元的AtomicIncrement函数

//对Target加一,并返回加一后的结果

class function Increment(var Target: Integer): Integer; overload; static; inline;

class function Increment(var Target: Int64): Int64; overload; static; inline;

//对Target减一,并返回减一后的结果

class function Decrement(var Target: Integer): Integer; overload; static; inline;

class function Decrement(var Target: Int64): Int64; overload; static; inline;

实例一:

var

a,b:integer;

begin

a:=1;

b:= TInterlocked.Increment(a);

//则b=2(等于a加一后的结果),同时a=2(a=1+1),而这时的a加一是原子操作,不会受多线程影响,能够保证数据一致性。

end;

2、对一个数值、指针、对象地址、泛型类的地址进行替换操作

//将Target替换为Value,并返回原来的Target值

//实际是调用System单元的AtomicExchange函数

class function Exchange(var Target: Pointer; Value: Pointer): Pointer; overload; static; inline;
class function Exchange(var Target: Integer; Value: Integer): Integer; overload; static; inline;
class function Exchange(var Target: Int64; Value: Int64): Int64; overload; static; inline;
class function Exchange(var Target: TObject; Value: TObject): TObject; overload; static; inline;
class function Exchange(var Target: Double; Value: Double): Double; overload; static; inline;
class function Exchange(var Target: Single; Value: Single): Single; overload; static; inline;

class function Exchange<T: class>(var Target: T; Value: T): T; overload; static; inline;

实例二:

var

a,b,c:integer;

begin

a:=1;

b:=2;

c:= TInterlocked.Exchange(a,b);

//则c=1(等于a之前的值),同时a=2(a被替换成b的值),而这时的a是原子操作,不会受多线程影响,能够保证数据一致性。

end;

3、比较两个值,相同时,用一个值替换掉目标值

//比较Target与Comparand两个值,当两个值相等,则将Target的值替换为Value的值,这个过程非常重要,是实现原子锁的核心

//实际是调用System单元的AtomicCmpExchange函数

class function CompareExchange(var Target: Pointer; Value: Pointer; Comparand: Pointer): Pointer; overload; static; inline;
class function CompareExchange(var Target: Integer; Value: Integer; Comparand: Integer): Integer; overload; static; inline;
class function CompareExchange(var Target: Integer; Value: Integer; Comparand: Integer; out Succeeded: Boolean): Integer; overload; static;
class function CompareExchange(var Target: Int64; Value: Int64; Comparand: Int64): Int64; overload; static; inline;
class function CompareExchange(var Target: TObject; Value: TObject; Comparand: TObject): TObject; overload; static; inline;
class function CompareExchange(var Target: Double; Value: Double; Comparand: Double): Double; overload; static; inline;
class function CompareExchange(var Target: Single; Value: Single; Comparand: Single): Single; overload; static; inline;

class function CompareExchange<T: class>(var Target: T; Value: T; Comparand: T): T; overload; static; inline;

这里要分成比较值相等和不相等两种情况

实例三:

var

a,b,c,d,e:integer;

begin

a:=1;

b:=2;

c:=3;

e:=1;

//比较a与c的值是否相等,相等则用b的值替换掉a的值,不相等则不替换

//由于a等于e(都等于1),则a的值被替换成b的值,即a=2,同时d等于a原来的值,即d=1

d:=TInterlocked.CompareExchange(a,b,e);

//由于a不等于c的值,所以a不会被替换,则d=1(等于a的值)

d:= TInterlocked.CompareExchange(a,b,c);

//注意了,不管a是否等于c和e的值,返回的一定是a原来的值,这个特性非常容易让我们判断a值到底是多少。

end;

4、用原子操作性读取一个数值

//如果在32位多线程中直接读取一个64位变量,寄存器是分为高字节和低字节两个部分,会读到脏数据,用原子操作读取则不会

class function Read(var Target: Int64): Int64; static; inline;

实际是调用System单元的AtomicExchange函数,如:b:=AtomicExchange(a,0,0);,始终会取到a原来的值,所以并不限于int64类型。

Delphi原子操作函数介绍的更多相关文章

  1. [原创] Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍

    Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍 函数原型:HWND HtmlHelpA( HWND hwndCaller, LPCSTR pszFile, UINT uCo ...

  2. Delphi TStream 详细介绍

    Delphi TStream 详细介绍Stream对象,又称流式对象,是TStream.THandleStream.TFileStream.TMemoryStream.TResourceStream和 ...

  3. python strip()函数 介绍

    python strip()函数 介绍,需要的朋友可以参考一下   函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm)        删除s字符串中开头.结尾处,位于 rm删除 ...

  4. PHP ob_start() 函数介绍

    ob_start() 函数介绍: http://www.nowamagic.net/php/php_ObStart.php ob_start()作用: http://zhidao.baidu.com/ ...

  5. delphi公共函数 UMyPubFuncFroc--版权所有 (C) 2008 勇者工作室

    {*******************************************************} { } { Delphi公用函数单元 } { } { 版权所有 (C) 2008 勇 ...

  6. Python开发【第三章】:Python函数介绍

    一. 函数介绍 1.函数是什么? 在学习函数之前,一直遵循面向过程编程,即根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复 ...

  7. row_number() OVER(PARTITION BY)函数介绍

      OVER(PARTITION BY)函数介绍 开窗函数               Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个 ...

  8. select与poll函数介绍

    select与poll函数介绍 在所有依从POSIX的平台上,select函数使我们可以执行I/O多路转接.传向select的参数告诉内核: 1)我们所关心的描述符 2)对于每个描述符我们所关心的状态 ...

  9. swift1.2语言函数和闭包函数介绍

    swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护. swift1.2语言函 ...

  10. ZLG_GUI配置与函数介绍

    http://www.docin.com/p-825479457.html ZLG_GUI配置与函数介绍

随机推荐

  1. shell脚本(8)-流程控制if

    一.单if语法 1.语法格式: if [ condition ] #condition值为 then commands fi 2.举例: [root@localhost test20210725]# ...

  2. SpringCloud对使用者透明的数据同步组件

    一.背景 云端使用Spring Cloud实现,A服务有一些数据,B和C服务也需要A服务的这些数据,但是系统上面只有A服务有数据操作的入口,B和C服务只能从A服务处同步数据到自己的表里面. 解决方案是 ...

  3. 【OpenVINO】基于 OpenVINO Python API 部署 RT-DETR 模型

    目录 1. RT-DETR 2. OpenVINO 3. 环境配置 3.1 模型下载环境 3.2 模型部署环境 4. 模型下载与转换 4.1 PaddlePaddle模型下载 4.2 IR模型转换 5 ...

  4. [转帖]linux系统上free命令看到的buff/cache到底是什么

    https://zhuanlan.zhihu.com/p/645904515 上周二一大早,小智准备早点去公司肝一篇技术文分享给大家的,哪成想,一到公司就被测试部的"卷王"拉去看问 ...

  5. [转帖]事务上的等待事件 —— enq: TX - contention

    TX锁是保护事务的,事务结束时便会释放.因此,为获得TX锁为等待的会话,要等到拥有锁的会话的事务结束为止. SQL> select name,parameter1,parameter2,para ...

  6. [粘贴]github-redis-rdb-cli

    redis-rdb-cli A tool that can parse, filter, split, merge rdb and analyze memory usage offline. It c ...

  7. [转帖]OpenSSL版本历史

    OpenSSL版本历史 新闻日志 这是所有 OpenSSL 公告的简洁日志.它们几乎是发布通知. 日期物品 2021 年 7 月 29 日OpenSSL 3.0 的 Beta 2 现已推出.这是一个候 ...

  8. [转帖]《Linux性能优化实战》笔记(十九)—— DNS 解析原理与故障案例分析

    一. 域名与 DNS 解析 域名主要是为了方便让人记住,而 IP 地址是机器间的通信的真正机制.以 time.geekbang.org 为例,最后面的 org 是顶级域名,中间的 geekbang 是 ...

  9. [转帖]gdb进阶调试技巧

    https://www.jianshu.com/p/9bdaa0644dba 整理一下在linux下C/C++用gdb工具debug一些提高效率的操作.基本的gdb操作就不在这里赘述了. 打印各种变量 ...

  10. [转帖]java -d 参数(系统属性) 和 环境变量

    https://www.cnblogs.com/limeiyang/p/16565920.html 1. -d 参数说明 通过 java -h 查看可知: 注意:-D= : set a system ...