Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Objective C,将Java中的volatile转换为Objective C的最佳方法是什么?_Objective C - Fatal编程技术网

Objective c Objective C,将Java中的volatile转换为Objective C的最佳方法是什么?

Objective c Objective C,将Java中的volatile转换为Objective C的最佳方法是什么?,objective-c,Objective C,我正在尝试将Java代码转换为目标C代码。java代码包含定义为volatile的变量。我在网上查看了java中的“易失性”用法,如下所示 Essentially, volatile is used to indicate that a variable's value will be modified by different threads. 所以,如果我要在Objective C中将变量设置为volatile,因为变量将由不同的线程访问,那么我不需要将这些变量设置为volatile,因

我正在尝试将Java代码转换为目标C代码。java代码包含定义为volatile的变量。我在网上查看了java中的“易失性”用法,如下所示

 Essentially, volatile is used to indicate that a variable's value will be modified by different threads.

所以,如果我要在Objective C中将变量设置为volatile,因为变量将由不同的线程访问,那么我不需要将这些变量设置为volatile,因为我可以将这些变量设置为原子变量

Objective-C中也存在
volatile
关键字。你可以用它

这是因为Objective-C是C的超集

将属性声明为
atomic
不会纠正
volatile
的作用
volatile
有效地告诉编译器不要优化对该变量所做的检查,因为当编译器希望它保持不变时,它可能已经改变了

最简单的例子就是这样。假设有一个全局变量声明为:

int packetsReceived = 0;
后来它被这样使用:

packetsRecieved = 0;

while (packetsRecieved < 10){
    //Wait for more packets
}

processPackets();

我们告诉编译器,这个变量可能会在任何时候发生变化,即使看起来应该保持不变。因此,在我们的示例中,编译器生成的机器代码仍将检查条件,并且我们的程序将按预期工作。

否,
原子的
易失性的
不是一回事

atomic
(在属性声明中)意味着getter/setter将确保获取/设置整个值,而不管其他线程可能同时执行什么操作


volatile
是编译器的一个指示器,指示可以通过其他方式(其他线程、内存映射IO设备)修改变量,因此它不应该优化(似乎)该变量不必要的加载/存储。这与Java中的含义类似,尽管Java增加了一些C(和Objective-C)没有提供的关于内存障碍和读写顺序的保证。特别是,在C语言中,仅仅声明一个变量
volatile
不足以从多个线程安全地使用它。

在不同线程之间共享可变对象可能是一个非常头痛的问题,并导致难以跟踪的bug。Objective-c对不可变对象有很大的偏好。我建议,如果可能的话,你可以找到一种方法来传递不可变的对象。这样,您就不必担心写入共享对象。

我实际上不知道Objective-C中的等价物,但我可以告诉您,Java中的“volatile”与原子性无关:它与缓存有关。易失性成员变量不会缓存在寄存器中,而是在每次需要其值时从内存中提取。在Objective-C中需要
volatile
(几乎只用于硬件寻址)是非常罕见的。如果您认为您需要volatile,那么几乎总是您做错了。如何通过另一个线程修改packetsrecieve?它只是一个局部变量。另一个线程如何访问它?
volatile int packetsRecieved;