- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
又是关于无锁的……
假设我实现了一个简单的基于数组的整数循环 FIFO。 FIFO 由 2 个线程单生产者、单消费者访问。读取和写入索引始终在访问项目后更新。在单个 CPU 上,这将是安全的(假设索引的更新操作是原子的),因为只有一个线程具有对索引的写访问权。在 SMP 机器上,这可能会导致问题,因为两个 CPU 可能会因为缓存和重新排序而看到不同的索引表示。
QT 具有跨平台原子变量,它也实现了内存栅栏,使用 QAtomicInt 会使 fifo 实现 SMP 安全还是我忽略了什么?
最佳答案
这将是安全的,前提是您的其余实现是合理的。
正如您提到的,QAtomicInt 实现了 memory fences防止指令重新排序,这也加强了处理器之间的缓存一致性(事实上,x86 和 x86_64 处理器的缓存无论如何都是一致的,尽管一致性协议(protocol)可能导致流水线停顿并降低性能,如果你依赖它紧密循环)。
关于c++ - 使用 QAtomicInt 作为内存栅栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14989048/
我有一个栅栏的 3D 模型。该模型包含 1 个起始柱和 1 个末端柱,中间有一个连接玻璃板。假设我希望能够指定任意长度的栅栏,并将其放置在虚拟世界中。如果可能的话,我将如何处理原始 3D 模型以将其更
x86指令lfence/sfence/mfence用于实现Linux内核中的rmb()/wmb()/mb()机制。很容易理解,这些用于序列化内存访问。但是,在遇到运行时行为中的错误之前,在编写代码时确
以下代码实现了一些无锁(且无原子!)的线程间通信,这些通信需要使用存储和加载内存屏障,但是C++ 11 release-acquire语义不适当,也不保证正确性。实际上,该算法暴露了对发布获取语义的某
我是一名优秀的程序员,十分优秀!