MacOSX: OSAtomic по сравнению с OSAtomicBarrier

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

#include <libkern/OSAtomic.h>

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

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

  1. Когда это безопасный использовать просто OSAtomic, без OSAtomicBarrier версия
  2. Когда это это OSAtomic было бы небезопасно, но OSAtomicBarrier было бы безопасно.

Кто-либо может обеспечить explainations + примеры кода?

[Случайные быстрые движения "Вашего мнения" без фактического кода бесполезны. Читатели: вниз проголосуйте за такие ответы; и vigrously upvote отвечает фактическим кодом.]

[Код C/C++ предпочтен; блок хорошо также.]

11
задан Ben Sinclair 8 November 2015 в 12:33
поделиться

1 ответ

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

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

Следующее не подходит:

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

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

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

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

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

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

7
ответ дан 3 December 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: