При каких обстоятельствах полезны атомные свойства? - PullRequest
6 голосов
/ 15 января 2011

Свойства Objective-C по умолчанию равны atomic, что гарантирует, что средства доступа являются атомарными, но не обеспечивает общую безопасность потоков (согласно этот вопрос ). Мой вопрос заключается в том, не являются ли атомарные свойства избыточными в большинстве сценариев параллелизма? Например:

Сценарий 1: изменяемые свойства

@interface ScaryMutableObject : NSObject {}

@property (atomic, readwrite) NSMutableArray *stuff;

@end

void doStuffWith(ScaryMutableObject *obj) {
    [_someLock lock];
    [obj.stuff addObject:something]; //the atomic getter is completely redundant and could hurt performance
    [_someLock unlock];
}

//or, alternatively
void doStuffWith(ScaryMutableObject *obj) {
    NSMutableArray *cachedStuff = obj.stuff; //the atomic getter isn't redundant
    [_someLock lock];
    [cachedStuff addObject:something]; //but is this any more performant than using a nonatomic accessor within the lock?
    [_someLock unlock];   
}

Сценарий 2: неизменяемые свойства

Я думал, что, возможно, атомарные свойства будут полезны для избежания блокировок при работе с неизменяемыми объектами, но поскольку неизменяемые объекты могут указывать на изменяемые объекты в Objective-C, это не очень помогает:

@interface SlightlySaferObject : NSObject {}

@property (atomic, readwrite) NSArray *stuff;

@end

void doStuffWith(SlightlySaferObject *obj) {
    [[obj.stuff objectAtIndex:0] mutateLikeCrazy];//not at all thread-safe without a lock
}

Единственные сценарии, которые я могу придумать, где безопасно использовать атомарные средства доступа без блокировки (и, следовательно, вообще стоит использовать атомарные свойства):

  1. Работа со свойствами, которые Примитивы; * * тысяча двадцать-одна
  2. Работа со свойствами, которые гарантированно будет неизменным и не указывать на изменчивые объекты (такие как NSString или NSArray из неизменяемые предметы).

Я что-то упустил? Есть ли другие веские причины для использования атомарных свойств?

1 Ответ

6 голосов
/ 15 января 2011

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

За пределами одного значения atomic нельзя использовать в целях обеспечения безопасности потоков.

Я довольно много писал об этом в посте в блоге некоторое время назад .

Этот вопрос также [оченьправильно поставленный] дубликат В чем разница между атомарными и неатомарными атрибутами?

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