微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多线程 – 在Delphi中避免缓存一致性问题与关键部分?

我只是读了一篇MSDN的文章 “Synchronization and Multiprocessor Issues”,它解决了多处理器机器上的内存缓存一致性问题.这真的是对我开放,因为我不会认为在他们提供的例子中可能会有一个竞争条件.这篇文章解释说,写入内存可能不会实际发生(从其他cpu的角度)按照我的代码中写的顺序.这对我来说是一个新概念!

本文提供2种解决方案:

>对于需要跨多个cpus缓存一致性的变量使用“volatile”关键字.这是一个C/C++关键字,在Delphi中不可用.
>使用InterlockExchange()和InterlockCompareExchange().这是我可以在德尔福做的事情,如果我不得不.它似乎有点凌乱.

文章还提到“以下同步功能使用适当的障碍来确保内存排序:•进入或离开关键部分的功能”.

这是我不明白的部分.这是否意味着对使用关键部分的功能的内存的任何写入都不受缓存一致性和内存排序问题的影响?我没有反对联锁*()功能,但我的工具带中的另一个工具将是好的!

解决方法

首先,根据语言标准,volatile不会做文章所说的.挥发性的获取和释放语义特定于MSVC.如果您使用其他编译器或其他平台编译,这可能是一个问题. C 11引入了语言支持的原子变量,希望在适当的时候终止(volatile)使用volatile作为线程构造.

关键部分和互斥体确实已实现,从而可以从所有线程正确看到受保护变量的读取和写入.

我认为想到关键部分和互斥体(锁)的最佳方式是带来序列化的设备.也就是说,由这种锁保护的代码块被串行执行,一个一个地执行而不重叠.序列化也适用于内存访问.由于缓存一致性或读/写重新排序,可能没有问题.

使用内存总线上基于硬件的锁实现联锁功能.这些功能由无锁定算法使用.这意味着它们不使用重型锁,如关键部分,而是使用这些重量轻的硬件锁.

锁定免费算法可以比基于锁的算法更有效,但锁定免费算法可能难以正确写入.喜欢关键部分超过锁定,除非性能影响是可辨别的.

值得一读的另一篇文章The “Double-Checked Locking is Broken” Declaration.

原文地址:https://www.jb51.cc/java/126923.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐