【问题标题】:Is a class member free of cache line issue?类成员是否没有缓存行问题?
【发布时间】:2014-10-23 13:00:52
【问题描述】:

TThread 类中有一个名为Terminated 的类成员(属性)。
还有一个procedure Terminate;,它只是将Terminated 设置为True
当我们从TThread 继承时,在某些情况下我们会检查是否终止。以下池/循环只是为了演示一种可能的情况:

  while not Terminated do
  begin
    Work;
  end;

什么是终止的保证不会被处理器缓存?

【问题讨论】:

    标签: multithreading delphi delphi-6


    【解决方案1】:

    Delphi 编译器在优化方面一点也不激进。它将类的成员视为全局。这意味着,本质上,不是本地。编译器知道其他方可以看到该变量。不像一个简单的局部变量。

    对于全局变量,编译器不会注册它对该变量的访问。因此,每当您读取变量时,都会从内存中读取值。同样在写入时,该值被写入内存。

    剩下的就是内存缓存。内存系统确保不同处理器高速缓存之间的一致性。

    所以,TThread 的终止实现没有问题。

    【讨论】:

    • 太棒了,有关于它的官方文档吗?现在我明白了,隐含在属性的文档中
    • 不,根本没有关于这些细节的文档。
    • 我接受这个答案是因为它的完整性
    【解决方案2】:

    Delphi 从不将属性值缓存在寄存器中,如果这就是您所指的。

    【讨论】:

    • 我刚刚接受了@David 的回答,因为它的完整性,好吗?
    • 那绝对没问题 :)
    猜你喜欢
    • 2015-08-11
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多