GCC реализует __sync_val_compare_and_swap
на PowerPC [64] как:
sync
1: lwarx 9,0,3
cmpw 0,9,4
bne 0,2f
stwcx. 5,0,3
bne 0,1b
2: isync
Документы GCC для встроенных __sync_*
:
В большинстве случаев эти встроенные функции рассматриваютсяполный барьер.То есть, операнд памяти не будет перемещаться по операции, ни вперед, ни назад.Кроме того, по мере необходимости будут выдаваться инструкции, чтобы процессор не мог спекулировать нагрузками во время операции и ставить в очередь хранилища после операции.
Однако использование isync
вместо sync
в конце меня беспокоит.Это на самом деле полный барьер?Или:
Не удалось ли выполнить загрузки после того, как __sync_val_compare_and_swap
не смог увидеть магазины, выполненные до того, как магазин, выдавший значение __sync_val_compare_and_swap
загружен?
Могут ли хранилища, выполненные после __sync_val_compare_and_swap
, быть видимыми другими потоками, прежде чем они увидят значение, сохраненное в __sync_val_compare_and_swap
?