TL; DR:在生产者-消费者队列中,是否有必要放置不必要的(从C ++内存模型的角度来看)内存围栏,或不必要地使用强内存顺序来获得更好的延迟,却以可能更差的吞吐量为代价?
[C ++内存模型是通过在硬件上执行某种形式的内存隔离来实现更强的内存顺序,而不是在较弱的内存顺序上执行的。
[特别是,如果生产者执行store(memory_order_release)
,并且消费者使用load(memory_order_acquire)
来观察存储的值,则在加载和存储之间没有隔离墙。在x86上根本没有栅栏,在ARM栅栏上存储之前和加载之后都进行了操作。
[不带围栏的存储的值最终将通过不带围栏的负载来观察(可能是几次尝试失败之后)
我想知道是否在队列的两边都设置了围栏可以使观察值更快?有无栅栏的延迟时间是多少?
[我希望仅将load(memory_order_acquire)
和pause
/ yield
的循环限制为数千次迭代是最佳选择,因为它已在各处使用,但想了解原因。
由于此问题与硬件行为有关,我希望没有通用的答案。如果是这样,我想知道的主要是x86(x64风格),其次是ARM。
基本上没有明显影响。