Для функций здесь:
#include <libkern/OSAtomic.h>
существует OSAtomic и версии OSAtomicBarrier.
Однако документация не показывает пример кода для:
OSAtomic
, без OSAtomicBarrier
версияOSAtomic
было бы небезопасно, но OSAtomicBarrier
было бы безопасно.Кто-либо может обеспечить explainations + примеры кода?
[Случайные быстрые движения "Вашего мнения" без фактического кода бесполезны. Читатели: вниз проголосуйте за такие ответы; и vigrously upvote отвечает фактическим кодом.]
[Код C/C++ предпочтен; блок хорошо также.]
На Intel и однопроцессорных платформах это не имеет значения.
Для многопроцессорных PPC-систем вы всегда должны использовать барьерное многообразие функций, если только атомарное сохранение не затрагивает никаких данных кроме атомарной переменной.
Следующее не подходит:
data_structure[y].data++;
OSAtomicIncrement32(y);
Вы должны использовать барьер здесь, потому что другие потоки могут увидеть data_structure как устаревшую.
Однако, если вы используете атомарную переменную для каких-то целей, где она стоит отдельно, вы можете опустить барьер:
// y is not used to access any other data
OSAtomicIncrement32(y);
Отлично, пока значение y не влияет на переменную какой-либо общей структуры данных.
По сути, это очистка кэша. Вы всегда можете безопасно использовать барьерные функции, но в некоторых случаях вы можете улучшить производительность, не используя барьерные функции, например, если y не используется относительно структуры данных. Вероятно, существует не так много случаев, когда можно использовать функции без барьера.