Почему операции arm atomic_ [read / write] реализованы как изменчивые указатели? - PullRequest
1 голос
/ 24 октября 2019

Он является примером реализации atomic_read:

#define atomic_read(v) (*(volatile int *)&(v)->counter)                                  

Кроме того, должны ли мы явно использовать барьеры памяти для атомарных операций на руке?

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Он является примером реализации atomic_read:

На самом деле проблемный, который предполагает, что приведение не является nop, , что не гарантируется .

Кроме того, должны ли мы явно использовать барьеры памяти для атомарных операций на руке?

Вероятно. Это зависит от того, что вы делаете и что вы ожидаете .

1 голос
/ 25 октября 2019

Да, приведение к volatile - это предотвращение предположения компилятора о том, что значение v не может измениться. Что касается использования барьеров памяти, встроенные функции GCC уже позволяют вам указать желаемый порядок памяти, нет необходимости делать это вручную: https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/_005f_005fatomic-Builtins.html#g_t_005f_005fatomic-Builtins

По умолчанию в GCC используется __ATOMIC_SEQ_CST, который будет выдаватьбарьеры, необходимые для Arm, чтобы убедиться, что ваши атомы выполняются в том порядке, в котором вы их разместили в коде. Чтобы оптимизировать производительность на Arm, вы можете рассмотреть возможность использования более слабой семантики, чтобы позволить компилятору устранить барьеры и позволить аппаратному обеспечению работать быстрее. Для получения дополнительной информации о типах барьеров памяти, имеющихся в архитектуре Arm, см. https://developer.arm.com/docs/den0024/latest/memory-ordering/barriers.

...