Delphi并发内存模型



Delphi中有类似Java内存模型的东西吗?为了防止误解:我指的不是"巨大/大/小",而是与其他线程的更改可见性相关的东西。

我认为Delphi内存模型与C++内存模型相匹配。也就是说,编译器不知道多个进程或多个线程,也不为这些场景提供任何特殊支持。请参阅"什么是用于并发的C++内存模型?">

Delphi 32位编译器确实执行了诸如不变代码运动之类的优化,并且确实发出了旨在避免双管道停滞的指令序列。然而,Delphi编译器不包含指令调度程序或窥视孔优化器,因此指令重新排序的机会微乎其微。Delphi优化发生在指令发出之前的AST/IR上。

局部变量可能会被注册,但对需要内存地址的变量的任何源代码引用(例如将局部变量传递给var param,或获取局部var的地址)都会迫使编译器在使用地址之前将已注册的值提交到内存位置,或者可能迫使编译器完全放弃对变量的注册。

Delphi 32位编译器在优化方面相当保守。优化带来的最大性能收益来自于注册变量和中间结果,以及各种循环诱导技巧。

对全局符号或驻留在全局内存中的符号(如对象字段)的操作不会被注册。不存在"挥发性"修饰语。

编译器代码生成模式依赖于x86体系结构规则,即寄存器大小的写入到对齐地址的全局内存是原子的。大数据、字节数据或未对齐地址的写入可能会跨越缓存线,并且需要在单个写入指令内进行两次单独的写入操作。Delphi编译器(大部分)忽略了这一点。

无论如何,如果您正在编写从不同线程访问共享内存的Delphi代码,那么您始终有责任决定哪些线程同步措施适合您的情况并实现它们。

最新更新