Objective C, Каков наилучший способ преобразовать volatile в Java в Objective C? - PullRequest
6 голосов
/ 17 марта 2011

Я пытаюсь преобразовать код Java в код Objective C.И код Java содержит переменные, определенные как volatile.Я посмотрел онлайн и "изменчивое" использование в java как следующеенужно установить переменные как изменчивые, потому что я могу просто установить эти переменные как атомарные?

Ответы [ 3 ]

18 голосов
/ 17 марта 2011

Ключевое слово 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;

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

7 голосов
/ 17 марта 2011

Нет, atomic и volatile - это не одно и то же.

atomic (в объявлении свойства) означает, что получатель / установщик обеспечит получение / установку целого значения, независимо от того, что другие потоки могут делать одновременно.

volatile указывает компилятору на то, что переменная может быть изменена другими средствами (другими потоками, устройствами ввода-вывода с отображением в памяти), поэтому она не должна оптимизировать (казалось бы) ненужные загрузки / сохранения этой переменной. Это похоже на то, что это означает в Java, хотя Java добавляет некоторые гарантии о барьерах памяти и порядке чтения и записи, которые C (и Objective-C) не предоставляют. В частности, в C простого объявления переменной volatile недостаточно для безопасного использования ее из нескольких потоков wikipedia: volatile переменная .

0 голосов
/ 17 марта 2011

Совместное использование изменяемых объектов между различными потоками может быть большой головной болью и вызывать ошибки, которые трудно отследить.Objective-c имеет большое предпочтение неизменным объектам.Я бы предположил, что если возможно, вы найдете способ обойти неизменяемые объекты вместо этого, если это возможно.Тогда вам не нужно беспокоиться об общем объекте, который будет записан.

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