繁体   English   中英

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

[英]Objective C, What is the best way to convert volatile in Java into Objective C?

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

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

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

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;

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

不, atomicvolatile物不是一回事。

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

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

在不同线程之间共享可变对象可能是一个令人头疼的问题并导致难以追踪的错误。 Objective-c对不可变对象有很大的偏好。 我建议如果可能的话,你会找到一种方法来传递不可变对象,如果可能的话。 然后,您根本不必担心共享对象被写入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM