Является ли BOOL чтение / запись атомарным в Objective C? - PullRequest
8 голосов
/ 14 февраля 2010

Что происходит, когда два потока устанавливают для BOOL значение YES "одновременно"?

Ответы [ 3 ]

7 голосов
/ 28 января 2014

Вот код для решения, предложенного 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.
    }
}
6 голосов
/ 14 февраля 2010

Нет. Без блокирующей конструкции чтение / запись любой переменной типа НЕ является атомарным в Objective C.

Если два потока пишут YES одновременно в BOOL, результатом будет YES независимо от того, какой из них попадет первым.

Пожалуйста, смотрите: Синхронизация выполнения потока

4 голосов
/ 09 августа 2016

Мне бы пришлось отклониться от принятого ответа. Сожалею. Хотя цель c не гарантирует, что свойства BOOL объявлены как неатомарные на самом деле атомные я должен был бы догадаться, что аппаратное обеспечение вы больше всего позаботьтесь о том, чтобы (все устройства iOS и macos) имели инструкции для атомарного чтения и сохранения байтов. Так что, если Apple не выпустит ОС Road Light на микроконтроллере IBM, который имеет 5-битную шину для отправки 10-битных байтов с тем же успехом можно использовать неатомные BOOL в ситуации, когда требуются атомарные BOOL. Код не будет переносимым на Road Light OS, но если вы можете пожертвовать защитой вашего кода от nonatomic прекрасно для этого варианта использования. Я уверен, что на кого-то есть закаленные люди. это поставило бы перед задачей разборки синтезированного получателя и установщика BOOL для атомных / неатомных случаев, чтобы увидеть, в чем разница. По крайней мере, на ARM.

Вероятно, вы получите от этого

  1. Вы можете объявить свойства BOOL как атомарные, и это не будет стоить вам ни цента на всех HW iOS и macOS изначально поддерживается.
  2. барьеры памяти ортогональны атомарности
  3. вам определенно не следует использовать 4-байтовые свойства для хранения логических значений в если вы не в [очень] нечеткой логике. Это идиотское и расточительное, вы не хотите быть клоном Java-программиста, кто не может отличить поплавок от дубля, или вы?
  4. BOOL-переменные (которые явно не поддерживают атомарные / неатомные декораторы не будет атомарным на некоторых узких архитектурах шины, цель C будет в любом случае не использовать (микроконтроллеры с или без [очень] микро ОС - это территория сборки и сборки, я полагаю. они, как правило, не нуждаются в багаже время выполнения объекта принесло бы)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...