- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读 this question about using a bool for thread control并被@eran 的回答所吸引:
Using volatile is enough only on single cores, where all threads use the same cache. On multi-cores, if stop() is called on one core and run() is executing on another, it might take some time for the CPU caches to synchronize, which means two cores might see two different views of isRunning_.
If you use synchronization mechanisms, they will ensure all caches get the same values, in the price of stalling the program for a while. Whether performance or correctness is more important to you depends on your actual needs.
The keyword volatile does not guarantee a memory barrier to enforce cache-consistency.
最佳答案
据我了解,同步原语根本不会影响缓存一致性。缓存是法语的隐藏,它不应该对用户可见。缓存一致性协议(protocol)应该在没有程序员参与的情况下工作。
同步原语将影响内存排序,这是明确定义的,并且通过处理器的 ISA 对用户可见。
A Primer on Memory Consistency and Cache Coherence 是一个提供详细信息的好来源来自计算机体系结构综合讲座系列。
编辑 : 澄清你的疑惑
维基百科的说法有些错误。我认为混淆可能来自内存一致性和缓存一致性这两个术语。他们不是同一个意思。volatile
C 中的关键字意味着变量总是从内存中读取(而不是寄存器),并且编译器不会重新排序围绕它的加载/存储。这并不意味着硬件不会重新排序加载/存储。这是一个内存一致性问题。当使用较弱的一致性模型时,程序员需要使用同步原语来强制执行特定的排序。这与缓存一致性不同。例如,如果线程 1 修改了位置 A,那么在此事件线程 2 加载位置 A 之后,它将收到一个更新的(一致的)值。如果使用缓存一致性,这应该会自动发生。内存排序是一个不同的问题。您可以查看著名论文Shared Memory Consistency Models: A Tutorial了解更多信息。 Dekker's Algorithm 是比较知名的例子之一。这需要顺序一致性或同步原语。
编辑2 : 我想澄清一件事。虽然我的缓存一致性示例是正确的,但存在内存一致性似乎与其重叠的情况。当存储在处理器中执行但延迟进入缓存时(它们在存储队列/缓冲区中)。由于处理器的缓存没有收到更新的值,其他缓存也不会。这看起来像是一个缓存一致性问题,但实际上它不是而且实际上是 ISA 内存一致性模型的一部分。在这种情况下,可以使用同步原语将存储队列刷新到缓存中。考虑到这一点,您以粗体突出显示的 Wikipedia 文本是正确的,但另一个仍然有点错误:关键字 volatile 不保证内存屏障来强制缓存一致性 .应该说:关键字 volatile 不能保证使用内存屏障来强制执行内存一致性 .
关于multithreading - 内存屏障强制缓存一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30958375/
GhostScript PDF/A 生成好像有错误 当您通过 GhostScript 生成 PDF/A 文档时,当您单击 Adobe Reader 时,会出现一个一致性选项卡,其中显示: “一致性
我有一个需要测试的 XPath 引擎实现。 是否有一组标准的一致性测试可以用来验证是否符合 XPath 规范(与 XSLT 相关)。 什么将是完美的 XML 文档 XPath 表达式和预期的结果。 最
帮助我了解在这种情况下我可以期望与 MongoDB 的一致性级别。 我们正在运行一个副本集,其中 Mongoid 中的 consistency 标志设置为 strong,这意味着只读到 master。
假设我有一个采用一个参数的方法。 此参数应满足以下要求: 'of type':方法需要知道参数属于特定类(或子类)。 'implements interface':方法需要知道参数实现了特定的接口(i
当协议(protocol)将属性声明为可选而具体类型将其声明为非可选时,如何使具体类型符合协议(protocol)? 这是问题所在: protocol Track { var trackNum
我正在考虑使用浏览器的 navigator.mimeTypes 数组作为第三级用户/浏览器标识符。例如,当我在 Chrome 上运行时... console.log(navigator.mimeTyp
我有以下协议(protocol): protocol ProtoAInput { func funcA() } protocol ProtoA { var input: ProtoAI
如果选择“最终”一致性,则发生写入的区域内的一致性是什么? 如果我只需要区域强一致性,应该选择哪个选项? 最佳答案 如果您需要在主要区域内进行强读取,则应该选择强一致性或有界过时一致性。 关于azur
您好,我是一名初学者,目前正在尝试学习 java 编程。课本上的问题: 编写一个程序来帮助人们决定是否购买混合动力汽车。你的程序的输入应该是:•新车的成本•预计每年行驶里程•预计汽油价格 •每加仑英里
我正在尝试制作一个可以在 UILabel 上使用的 Swift 协议(protocol), UITextField , 和 UITextView包含他们的text , attributedText ,
我有一个类扩展: extension UICollectionViewCell { class func registerFromNibInCollectionView(collectionV
为了在 Swift 中模拟对象进行测试,我通常遵循这样的模式:编写一个协议(protocol)来描述我想要的对象的行为,然后使用 Cuckoo 为其生成模拟以进行测试。 通常,这些协议(protoco
假设我有两个非通用协议(protocol)(1) protocol StringValue { var asString: String {get} } protocol StringProv
我有一组协议(protocol)可以在 UITableView 中显示一个元素: protocol TableRepresentableRow { var title: String { get
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
用“class”标记 CacheManager 解决了我的问题。 案例:一个简单的缓存器,mutating get 不是我想要的,那么对于引用类型或类类型应该怎么做? protocol Cacher
我想要一个符合协议(protocol)的变量,但是 swift 编译器告诉我协议(protocol)没有确认。 protocol A {} protocol B { var a : A { g
如果我有一个类 Christmas 和一个协议(protocol) Merry,要使 Christmas 符合 Merry,很多人会这样做: class Christmas { ... } e
@objc public protocol P1 { func p1foo() } @objc public protocol P2 { func p2foo() } class A: NSO
我有一些结构符合的基本协议(protocol)(模型)。它们也符合 Hashable protocol Model {} struct Contact: Model, Hashable { v
我是一名优秀的程序员,十分优秀!