MacOSX: OSAtomic vs OSAtomicBarrier

Для функций здесь:

#include <libkern/OSAtomic.h>

существуют версии OSAtomic и OSAtomicBarrier.

Однако документация не показывает пример кода для:

  • Когда безопасно использовать только OSAtomic, без OSAtomicBarrier version
  • Когда это значит, что OSAtomic будет небезопасным, но OSAtomicBarrier будет безопасным.

Может ли кто-нибудь предоставить объяснения + примеры кодов?

[Случайные штрихи "ваше мнение" без реального кода бесполезны. Читатели: пожалуйста, голосуйте за такие ответы; и головокружительно поднимать ответы с помощью фактического кода.]

[предпочтительный код на C/С++; Сборка тоже в порядке.]

Ответ 1

На платформах Intel и однопроцессорных системах это не имеет значения.

Для многопроцессорных систем PPC вы всегда должны использовать барьерное разнообразие функций, если атомный магазин не влияет на данные, отличные от атомной переменной.

Ниже будет не так:

data_structure[y].data++;
OSAtomicIncrement32(y);

Здесь вы должны использовать барьер, потому что другие потоки могут видеть data_structure как устаревшие.

Однако, если вы используете атомную переменную для какой-либо цели, где она стоит одна, вы можете опустить барьер:

// y is not used to access any other data
OSAtomicIncrement32(y);

Хорошо, если значение y не влияет на переменную какой-либо общей структуры данных.

По сути, это кеш-флеш. Вы всегда можете безопасно использовать барьерные функции, но в некоторых случаях вы можете улучшить производительность, не используя барьерные функции, например, если y не используется относительно структуры данных. Вероятно, не так много случаев, когда вы можете использовать функции без барьера.