Objective C, Каков наилучший способ преобразования volatile в Java в Objective C?
Я пытаюсь преобразовать Java-код в Objective C-код. И java-код содержит переменные, определенные как изменчивые. Я смотрел онлайн и "неустойчивое" использование в java как follwing
Essentially, volatile is used to indicate that a variable value will be modified by different threads.
Итак, если бы я собирался установить переменные как изменчивые в Objective C, потому что переменные будут доступны для разных потоков, тогда мне не нужно устанавливать эти переменные как изменчивые, потому что я могу просто установить эти переменные как атомарные?
Ответы
Ответ 1
Ключевое слово volatile
существует в Objective-C. Вы можете использовать его.
Это потому, что Objective-C является надмножеством C.
Объявление свойств как atomic
не будет исправлять то, что предназначалось volatile
. volatile
эффективно сообщает компилятору, чтобы он не оптимизировал пропущенные проверки для этой переменной, потому что он, возможно, изменился, когда компилятор ожидал, что он останется прежним.
Простейшим примером является это. Скажем, у нас есть глобальная переменная, объявленная как:
int packetsReceived = 0;
И позже он используется следующим образом:
packetsRecieved = 0;
while (packetsRecieved < 10){
//Wait for more packets
}
processPackets();
Мы никогда не пройдем через этот цикл, потому что компилятор скажет: "Эй, packetsRecieved
никогда не изменяется в этом цикле, поэтому он будет работать бесконечно". В результате, он просто сделает его прямым бесконечным циклом, чтобы он не мог каждый раз проверять.
Если мы вместо этого объявили переменную как:
volatile int packetsRecieved;
Мы сообщаем компилятору, что эта переменная может измениться в любое время, даже если похоже, что она должна оставаться неизменной. Поэтому в нашем примере машинный код, сгенерированный компилятором, по-прежнему будет проверять состояние, и наша программа будет работать, как ожидалось.
Ответ 2
Нет, atomic
и volatile
- это не одно и то же.
atomic
(в объявлении свойства) означает, что getter/setter гарантирует, что все значение будет получено/установлено, независимо от того, что другие потоки могут выполнять одновременно.
volatile
является индикатором для компилятора, что переменная может быть изменена другими средствами (другими потоками, IO-устройствами с отображением памяти), поэтому она не должна оптимизировать (по-видимому) ненужные нагрузки/запасы этой переменной. Это похоже на то, что это означает в Java, хотя Java добавляет некоторые гарантии относительно барьеров памяти и упорядочения чтения и записи, которые C (и Objective-C) не предоставляют. В частности, в C просто объявить переменную volatile
недостаточно, чтобы безопасно использовать ее из нескольких потоков wikipedia: изменчивая переменная.
Ответ 3
Обмен изменяемыми объектами между различными потоками может быть большой головной болью и вызвать ошибки, которые трудно отследить. Objective-c имеет большое предпочтение к неизменяемым объектам. Я бы предположил, что, если это возможно, вы обнаружите способ переложить вокруг неизменяемых объектов, если это возможно. Тогда вам не нужно беспокоиться о том, что общий объект записывается вообще.