我正在尝试将Java代码转换为Objective C代码.并且java代码包含定义为volatile的变量.我在网上查看了java中的"volatile"用法,如下所示
Essentially, volatile is used to indicate that a variable's value will be modified by different threads.
Run Code Online (Sandbox Code Playgroud)
所以,如果我要在Objective C中将变量设置为volatile,因为变量将由不同的线程访问,那么我不需要将这些变量设置为volatile,因为我可以将这些变量设置为atomic?
Chr*_*per 18
该volatile
关键字在Objective-C中也存在.你可以使用它.
这是因为Objective-C是C的超集.
声明属性atomic
不会纠正volatile
意图.volatile
有效地告诉编译器不要优化对该变量进行的检查,因为当编译器期望它保持不变时它可能已经改变了.
最简单的例子就是这样.假设我们有一个全局变量声明为:
int packetsReceived = 0;
Run Code Online (Sandbox Code Playgroud)
它后来使用如下:
packetsRecieved = 0;
while (packetsRecieved < 10){
//Wait for more packets
}
processPackets();
Run Code Online (Sandbox Code Playgroud)
我们将永远不会通过该循环,因为编译器会说"嘿,packetsRecieved
永远不会在该循环中修改,因此它将无限运行".因此,它只会使它成为一个直的无限循环,因此它可以避免每次都检查.
如果我们改为将变量声明为:
volatile int packetsRecieved;
Run Code Online (Sandbox Code Playgroud)
我们告诉编译器这个变量可能随时改变,即使它看起来应该保持不变.因此在我们的示例中,编译器生成的机器代码仍将检查条件,并且我们的程序将按预期工作.
没有,atomic
和volatile
不一样的东西.
atomic
(在属性声明中)意味着getter/setter将确保获取/设置整个值,而不管其他线程可能同时执行的操作.
volatile
是一个指示编译器可以通过其他方式(其他线程,内存映射的IO设备)修改变量,因此它不应该优化(看似)该变量的不必要的加载/存储.这与Java中的含义相似,尽管Java增加了一些关于内存障碍和C(和Objective-C)不提供的读写顺序的保证.特别是在C中,简单地声明一个变量volatile
不足以从多个线程wikipedia:volatile变量中安全地使用它 .
归档时间: |
|
查看次数: |
4011 次 |
最近记录: |