Java Delphi并发内存模型?

Java Delphi并发内存模型?,java,delphi,concurrency,Java,Delphi,Concurrency,德尔福有类似的情况吗?为了防止误解:我的意思是“大/大/小”,但与其他线程的可见性相关的事情。 < P>我认为Delphi内存模型与C++内存模型匹配。也就是说,编译器不知道有多个进程或多个线程,也不为这些场景提供任何特殊支持。看 Delphi 32位编译器确实执行优化,例如不变代码运动,并且发出旨在避免双管道停滞的指令序列。但是,Delphi编译器不包含指令调度器或窥视孔优化器,因此指令重新排序的机会微乎其微。在发出指令之前,在AST/IR上进行Delphi优化 局部变量可以注册,但对需要内存

德尔福有类似的情况吗?为了防止误解:我的意思是“大/大/小”,但与其他线程的可见性相关的事情。

< P>我认为Delphi内存模型与C++内存模型匹配。也就是说,编译器不知道有多个进程或多个线程,也不为这些场景提供任何特殊支持。看

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

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

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

对全局符号或驻留在全局内存中的符号(如对象字段)的操作不进行注册。没有“挥发性”修饰语

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


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

@David Heffernan:如果事情就这么简单,那么就不需要内存模型了。amd64体系结构不保证在没有特殊指令的情况下正常访问内存。在多核系统上,除非您使用
volatile
或执行某些同步,否则无法保证线程会看到运行在不同内核上的线程在内存中所做的任何更改。这种情况确实发生了,而且非常常见。x86和x64具有强大的内存模型:至于
volatile
,我很清楚,尽管它有许多不同的含义,这取决于您使用的编译器。但既然你说的是德尔福,它在这里就没有意义了。我的理解是,Delphi使非局部变量具有易变性,以便对易变性进行适当的定义!如果Intel/AMD“削弱”x86/x64指令集的现有内存模型,地球上的每个应用程序和操作系统都将崩溃。它们只能“削弱”现有代码和编译器不使用的新指令或新执行模式的内存语义。英特尔和AMD对“选择加入”非常了解。我不能对当前的Delphi编译器内容发表评论,但我可以对英特尔/AMD硬件非常坚决。:>@您能对D6编译器发表意见吗?我知道目前的32位编译器在这个领域几乎无法区分。丹尼,这是一个非常好的书面回答。干得好!这是我希望能不止一次投票的罕见情况之一。+1,回答得很好。不过,我想知道是否有任何计划/意图来改进Delphi关于进程和线程的内存模型。顺便说一句,有人知道64位编译器是否以同样的方式工作吗?谢谢。关于64位,@Guillem,从我所看到的来看,它采用了相同的注册策略。我不能谈论计划或意图。我从2005年起就不在圈子里了。