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 имеет большое предпочтение к неизменяемым объектам. Я бы предположил, что, если это возможно, вы обнаружите способ переложить вокруг неизменяемых объектов, если это возможно. Тогда вам не нужно беспокоиться о том, что общий объект записывается вообще.