Реальные варианты использования барьеров (DSB, DMB, ISB) в ARM
Я понимаю, что DSB, DMB и ISB являются барьерами для предотвращения изменения порядка команд. Я также могу найти множество очень хороших объяснений для каждого из них, но довольно сложно представить, что я должен их использовать.
Кроме того, из открытых исходных кодов я время от времени вижу эти барьеры, но довольно сложно понять, почему они используются. Для примера: в ядре Linux 3.7 с функцией tcp_rcv_synsent_state_process есть следующая строка:
if (unlikely(po->origdev))
sll->sll_ifindex = orig_dev->ifindex;
else
sll->sll_ifindex = dev->ifindex;
smp_mb();
if (po->tp_version <= TPACKET_V2)
__packet_set_status(po, h.raw, status);
где smp_mb () в основном DMB. Не могли бы вы привести примеры из жизни? Это поможет понять больше о барьерах.