Что происходит, когда два потока устанавливают BOOL на YES «в одно и то же время»?Является ли BOOL для чтения/записи атома в Objective C?
ответ
Номер без стопорной конструкции, чтение/запись любого переменного типа, не является атомарным в Objective C.
Если два потока написать ДА в то же время к BOOL, результат ДА независимо от того, какой из них получает во-первых.
Пожалуйста, см: Synchronizing Thread Execution
Спасибо, Митч. ead устанавливает его в YES, а другой устанавливает значение NO, может ли быть повреждение памяти? – Jacko
http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html дает очень подробное обсуждение. Я думаю, что я буду использовать int вместо BOOL и использовать операции OSAtomic для этого int. – Jacko
Вмешательство в ваш вопрос заключается в том, может ли хруст какой-либо другой фрагмент памяти. Нет; этого не может быть. Самое худшее, что произойдет, вы прочитаете NO, похоже, после того, как вы написали ДА в другом потоке. – bbum
Вот код для решения предложенного Jacko.
Использование volatile
uint32_t
с OSAtomicOr32Barrier
и OSAtomicAnd32Barrier
#import <libkern/OSAtomic.h>
volatile uint32_t _IsRunning;
- (BOOL)isRunning {
return _IsRunning != 0;
}
- (void)setIsRunning:(BOOL)allowed {
if (allowed) {
OSAtomicOr32Barrier(1, & _IsRunning); //Atomic bitwise OR of two 32-bit values with barrier
} else {
OSAtomicAnd32Barrier(0, & _IsRunning); //Atomic bitwise AND of two 32-bit values with barrier.
}
}
Прохладный! Но почему бы просто не использовать 'OSAtomicOr32Barrier (allowed, & _IsRunning);' вместо условного оператора? –
Да, вы можете использовать. –
А, это не так просто, извините. Вы не можете использовать «или» версию для сброса флага, т. Е. Для этого вы должны использовать «и» версию (OSAtomicAnd32Barrier). –
Я бы отклоняться от принятого ответа. Сожалею. Хотя объектив c не гарантирует, что свойства BOOL, объявленные как неатомные , на самом деле атомарны, я должен угадать, что аппаратное обеспечение, которое вы больше всего заботитесь (все устройства iOS и macos), имеет инструкции для выполнения байтов, считывающих и хранящих атомарно. Итак, если Apple не выйдет с ОС Road Light, работающей на микроконтроллере IBM, который имеет шину шириной 5 бит для отправки 10-битных байтов по сравнению с , вы могли бы также использовать неатомные BOOL в ситуации, которая требует атомных BOOL. Код не был бы переносимым для Road Light OS, но если вы можете жертвовать будущей безопасностью вашего кода, неатомный, это нормально для этого варианта использования. Я уверен, что есть ожесточенные люди на s.o. что поднимет задачу демонтажа синтезированного приемника BOOL и сеттера для атомных/неатомических случаев, чтобы узнать, в чем разница. По крайней мере, на ARM.
Ваш вынос из этого, скорее всего, это
- вы можете объявить свойства BOOL как атомная и это не будет стоить вам ни копейки на всех HW прошивкой и MacOS внутренне поддерживает.
- барьеры памяти ортогональны атомарность
- вы определенно не должны использовать 4 свойство байт для хранения Булевых в , если вы не в [самой] нечеткую логику. Это идиотский и расточительный, вы не хотите быть клоном Java-программиста, , который не может сказать поплавок из двойника, или вы?
- BOOL переменные (которые не очевидно, поддерживают атомные/неатомические декоратор не будет атомными на некоторых узких шинные архитектурах цели C бы не использовать в любом случае (микроконтроллеры с или без некоторого [самого] микро OS являются C & сборки территории Я полагаю, что они обычно не нуждаются в багаже ObjC выполнения принесет)
- 1. Objective-C Bool Вопрос
- 2. Objective-C - Is !! BOOL Beneficial
- 3. Значение Bool в Objective C
- 4. Указатель BOOL в Objective C
- 5. BOOL вопрос в Objective-C
- 6. Оценка BOOL в Objective-C
- 7. Словарь Objective-C, вставляющий BOOL
- 8. Objective-C: bool несовместимый указатель
- 9. static BOOL in Objective C
- 10. Является ли Objective C конкретным?
- 11. Есть ли разница между BOOL и Boolean в Objective-C?
- 12. Weird Objective-C BOOL поведение
- 13. Objective-C BOOL всегда проходит
- 14. ARM: Является ли запись/чтение из атома атома?
- 15. Свойства BOOL, имена в Objective C
- 16. Литые BOOL к идентификатору в Objective-C
- 17. Используйте блок в Objective C, чтобы узнать, установлен ли BOOL?
- 18. Как представить дополнительный Bool (Bool?) В Objective-C?
- 19. IOS/Objective C: доступ BOOL свойство
- 20. Когда свойства BOOL удаляются в Objective-C?
- 21. как переключать значение BOOL в Objective-C
- 22. Является ли это использование атома правильным?
- 23. Objective-C Bool Литералы и макросы
- 24. Синтезировать BOOL для установки значения в Objective C
- 25. Objective C - BOOL литая ноль или НЕТ
- 26. Objective-C: Возвращение int к методу BOOL
- 27. Является ли словарь Objective-C упорядоченным контейнером?
- 28. Является ли .hash в Objective-C эквивалентом .hashValue в Swift?
- 29. Считывает и записывает свойства атома в C#?
- 30. проверить, является ли значение целочисленным (Objective-C)
Он открывает червоточину в другое измерение. – dreamlax
Если они оба установить его в 'YES', не может быть проблемой может ли запись атомарной или нет, может ли там? –
@CarlNorum, которая может быть правдой, но это не очевидно для меня, почему –