我想转换成Swift从目标-C代码如下;
int sum = 0;
x = 1;
for (int i = 0; i < 100; i++) {
sum += x;
}X可以从其他线程访问。因此x被声明为一个易失性变量。
volatile int x;我应该如何用Swift编写这段代码?
编辑的
抱歉,我的伪码不好。
我只是想读取最新的值属性或字段,而不是从线程缓存中读取。Java易失性使之成为可能。目标C也不稳定。(是吗?)
发布于 2015-11-20 15:03:21
目前在Swift中没有与volatile等效的内容。
在Swift中,您可以使用比volatile关键字更有效的方法来表示值的全局同步性--它不提供任何类型的原子性保证,必须与锁一起使用以建立关键部分。例如,您可以选择锁来同步对变量的读写访问。您可以选择使用MVar来指示一个变量应该在多个线程之间只有一个可能的有效状态。
或者你可以选择不用Swift来表达问题。如果您正在寻找volatile变量的确切行为(在您的情况下,这听起来不太可能),请使用C和C++。
发布于 2020-05-24 01:42:15
我将对@potatoswatter(优秀)的评论进行扩展。这里有几个误解
Volatile与可访问性无关。Volatile不是一个足够的构造,因为它确保了线程在访问该变量时的read一致性。您的用例涉及到mutations到x,因此需要更彻底的并发构造的synchronization。这是一个中等先进的概念,不属于swift的舵手。发布于 2022-07-23 07:48:30
目前Swift 5中没有与volatile等效的,但是不需要任何等效,至少如果您的变量是类的成员变量的话。
volatile关键字-- C、C++、Objective-C、Objective-C++或Java语言--确实只要求编译器善意地而不是缓存变量的值(而是每次读取相关内存)。
另外,正如其他答复/评论所提到的,对于OP的情况,volatile是不够的(并且OP应该使用锁)。
示例
Swift对类成员似乎没有这么好的编译时缓存,因此不需要volatile关键字,我们可以这样做:
public class Volatile<T> {
public var value: T;
public init(_ defaultValue: T) {
self.value = defaultValue;
}
}用法
var myVariable = Volatile("my value");或者:
var myVariable: Volatile<String> = .init("my value");https://stackoverflow.com/questions/24971489
复制相似问题