Является ли метод сохранения NSObject атомарным? - PullRequest
11 голосов
/ 17 января 2011

Является ли метод сохранения NSObject атомарным?

Например, при сохранении одного и того же объекта из двух разных потоков обещано ли, что количество сохраненных данных увеличилось вдвое, или возможно, что число сохраненных данных будет увеличено только один раз?

Спасибо.

1 Ответ

13 голосов
/ 17 января 2011

NSObject, а также функции выделения и сохранения объектов являются поточно-ориентированными - см. Приложение A: Сводка по безопасности потоков в Руководстве по программированию потоков .


Редактировать : Я решил взглянуть на часть Core Foundation с открытым исходным кодом. В CFRuntime.c , __CFDoExternRefOperation() является функцией, отвечающей за обновление счетчиков хранения. Он проверяет, имеет ли процесс более одного потока, и, если имеется более одного потока, он получает блокировку вращения перед обновлением счетчика хранения, что делает этот поток операций безопасным.

Интересно, что счет сохранения не является атрибутом (или переменной экземпляра) объекта в смысле struct (класс). Среда выполнения хранит отдельную структуру с сохранением счетчиков. На самом деле, если я правильно понимаю, эта структура представляет собой массив хеш-таблиц, и для каждой хеш-таблицы есть спин-блокировка. Это означает, что блокировка относится к нескольким объектам, которые были помещены в одну и ту же хеш-таблицу, то есть блокировка не является ни глобальной (для всех экземпляров), ни для каждого экземпляра.

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