Является ли задание с одним поплавком атомарной операцией на iPhone? - PullRequest
5 голосов
/ 31 марта 2010

Я предполагаю, что на 32-разрядном устройстве, таком как iPhone, назначение короткого числа с плавающей запятой является атомарной, поточно-ориентированной операцией. Я хочу убедиться, что это так. У меня есть функция C, которую я хочу вызвать из потока Objective-C, и я не хочу получать блокировку перед ее вызовом:

void setFloatValue(float value) {
    globalFloat = value;
}

Ответы [ 3 ]

5 голосов
/ 31 марта 2010

В 32-битном ARM указанная выше функция будет скомпилирована в

ldr r2, [pc, #0x??]  ; to retrieve the address of globalFloat
str r0, [r2]         ; store value into globalFloat

Поскольку существует 2 инструкции, и ЦПУ может выполнять любые действия между ними, но только вторая инструкция str r0, [r2] влияет на память. Если globalFloat не выровнен, центральный процессор может выполнять атомную запись в одну копию.

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

Быть атомарным недостаточно для безопасности потоков. Из-за кеширования и переупорядочения инструкций ваши изменения могут быть невидимы для других ядер ЦП. Возможно, вам придется вставить OSMemoryBarrier(), чтобы «опубликовать» изменения.

Атомарные операции обычно интересны, когда они включают сложные операции (например, globalFloat += value). Вы можете проверить встроенную библиотеку OSAtomic для этого.

3 голосов
/ 31 марта 2010

Да, это будет атомно. В 32-разрядной архитектуре любая операция хранения с примитивным типом данных, который является 32-разрядным или менее (char, short, int, long, float и т. Д.), Будет атомарной.

0 голосов
/ 15 ноября 2010

В вашем вопросе есть нечто большее, чем просто атомарность. Даже если запись является атомарной, нет гарантии, что другой поток увидит изменение без какого-либо барьера памяти. Это, вероятно, не проблема с текущими iPhone, потому что они имеют только один процессор, но это может быть проблемой на настольных компьютерах.

См:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...