内存屏障除了保证原子操作的执行顺序之外,是否还能提高原子操作的可见速度?
在生产者-消费者的上下文中队列中,通常的情况是生产者存储的数据旨在尽快对消费者可见。人们可能想知道在生产者的存储操作和消费者的加载操作之间添加硬件内存栅栏是否有助于实现这一目标。
但是,添加内存栅栏不会显着影响多线程中原子操作的延迟。核心系统。原因是硬件已经确保存储操作对所有其他核心的可见性,无论是否存在内存栅栏。
没有栅栏会发生什么?
在没有栅栏的情况下,生产者具有释放内存顺序的存储操作保证在将来的某个时刻对所有其他核心可见。在 x86 架构上,不存在硬件屏障,而在 ARM 架构上,栅栏放置在存储操作之前(在生产者端)和加载操作之后(在消费者端)。
尽管没有在 x86 的情况下使用硬件栅栏,没有栅栏的生产者存储的值最终将被没有栅栏的加载操作观察到。此过程可能需要几次不成功的加载尝试,但最终会成功。
内存屏障对延迟的影响
添加内存屏障通常不会减少延迟由于以下原因观察存储值的延迟:
结论
在大多数情况下,添加不必要的内存屏障生产者-消费者队列中原子操作之间的内存屏障不会改善延迟。硬件已经保证了原子操作的可见性,而不需要显式的内存屏障。分析对于识别内存屏障有益的情况至关重要,并且应该仅在必要时使用它。
以上是内存屏障会加速生产者-消费者队列中的原子操作吗?的详细内容。更多信息请关注PHP中文网其他相关文章!