Неатомные и атомные потоки небезопасны в цели c?

Я читал, что неатомные и атомарные оба потока небезопасны. но неатомарный - быстрее, потому что он обеспечивает более быстрый доступ, значит асинхронный, а атомарный медленнее - синхронный доступ медленнее.

1 ответ

Решение

atomic свойство в Objective C гарантирует, что вы никогда не увидите частичные записи.

То есть, если два потока одновременно записывают значения A и B в одну и ту же переменную X, то одновременное чтение по этой же переменной даст либо начальное значение X, либо A или B. nonatomic эта гарантия больше не предоставляется. Вы можете получить любое значение, включая значения, которые вы никогда явно не записывали в эту переменную.

Причина этого заключается в том, что с nonatomicпоток чтения может прочитать переменную, в то время как другой поток находится в середине записи. Таким образом, часть того, что вы читаете, происходит от старого значения, а другая часть - от нового значения.

Комментарий о том, что оба они небезопасны, относится к тому факту, что никаких дополнительных гарантий не предоставляется. Документы Apple приводят следующий пример:

Рассмотрим XYZPerson объект, в котором имя и фамилия человека изменяются с помощью атомарных методов доступа из одного потока. Если другой поток обращается к обоим именам одновременно, методы атомарного метода получения возвращают полные строки (без сбоев), но нет гарантии, что эти значения будут правильными именами относительно друг друга. Если к изменению обращаются к первому имени, а после изменения - к последнему имени, вы получите непоследовательную, несовпадающую пару имен.

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

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

Другие вопросы по тегам