当前位置: 首页 > 面试题库 >

Swift变量是原子的吗?

戈睿识
2023-03-14
问题内容

在Objective-C中,您可以区分原子性质和非原子性质:

@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;

根据我的理解,您可以安全地从多个线程读取和写入定义为原子的属性,而同时从多个线程中写入和访问非原子属性或ivars可能导致不确定的行为,包括严重的访问错误。

因此,如果您在Swift中有这样的变量

var object: NSObject

我可以安全地并行读写该变量吗?(不考虑这样做的实际含义)。


问题答案:

假设尚无底层文档,这还为时尚早,但是您可以从汇编中学习。料斗拆卸器是一个很棒的工具。

@interface ObjectiveCar : NSObject
@property (nonatomic, strong) id engine;
@property (atomic, strong) id driver;
@end

在非原子和原子上分别使用objc_storeStrongobjc_setProperty_atomic,其中

class SwiftCar {
    var engine : AnyObject?    
    init() {
    }
}

使用swift_retainlibswift_stdlib_core并且显然没有内置线程安全性。

我们可以推测,@lazy稍后可能会引入其他关键字(类似于)。

更新07/20/15 :根据有关单例快速环境的此 博文
,可以使某些情况下线程对您安全,即:

class Car {
    static let sharedCar: Car = Car() // will be called inside of dispatch_once
}

private let sharedCar: Car2 = Car2() // same here
class Car2 {

}

16年5月25日更新 :关注快速发展的建议https://github.com/apple/swift-
evolution/blob/master/proposals/0030-property-behavior-
decls.md-

看起来像是@atomic自己实现行为成为可能。



 类似资料:
  • 问题内容: 如果我有两个线程同时修改结构上的字符串字段,我是否总是会看到分配给该字段的一个或另一个字符串,但没有别的? 问题答案: 否。如果您需要原子操作,则存在。 在转到内存模型将所有相关的细节。在“内存模型”文档的顶部: 修改由多个goroutine同时访问的数据的程序必须序列化此类访问。 要序列化访问,请使用通道操作或其他同步原语(例如和 软件包中的原语)保护数据。

  • 问题内容: 假设我使用处理程序来处理间隔计时器。 我可以不用担心在设置(例如,Python VM正在执行字节码来设置变量)的情况下,信号处理程序中的分配会中断某些情况吗?(即 亚稳态 ) 更新 :我对在处理程序外部进行“复合赋值”的情况特别感兴趣。 (也许我想的太“低级”了,这一切都在Python中得到了解决……来自嵌入式系统的背景,我时常有这种冲动) 问题答案: 对简单变量的简单分配是“原子的”

  • 问题内容: 如果长变量声明为:- 私有易失性长计数器= 0; 现在,如果我使用预增量运算符对其进行增量,那么该操作将是原子的吗? 如果是,那么它将比对象的增量效率更高吗? 问题答案: 关键字只能解决可见性问题。您必须使用或方法/块来实现原子性(并发编程中的原子性)。 今天又发表了一篇文章:演示何时需要挥发物

  • 问题内容: 参考以下链接:http : //docs.python.org/faq/library.html#what- kinds-of-global-value-mutation-are-thread- safe 我想知道以下情况: 在cPython中将保证是原子的。(x和y都是python变量) 问题答案: 让我们来看看: 它不会出现,他们是原子:x的和y的值可以被另一个线程之间改变字节码,

  • 主要内容:1. 变量声明,2.类型注解声明,3.命名变量,4. 打印变量变量提供了程序可以操作的命名存储。 Swift 4中的每个变量都有一个特定的类型,它决定了变量内存的大小和布局; 可存储在该内存中的值范围; 以及可以应用于变量的操作集。 Swift 4支持以下基本类型的变量 - 或 - 用于整数。 更具体地说,可以使用,来定义位或位有符号整数,而使用或来定义位或位无符号整数变量。 例如,和。 - 用于表示位浮点数,它用于保存小数点较小的数字。 例如,,和。 -

  • 变量是一种使用方便的占位符,用于引用计算机内存地址。 Swift 每个变量都指定了特定的类型,该类型决定了变量占用内存的大小,不同的数据类型也决定可存储值的范围。 上一章节我们已经为大家介绍了基本的数据类型,包括整形Int、浮点数Double和Float、布尔类型Bool以及字符串类型String。此外,Swift还提供了其他更强大数据类型, Optional, Array, Dictionary