gpt4 book ai didi

swift - Property Wrapper @Lazy 变量线程安全吗?

转载 作者:行者123 更新时间:2023-12-04 11:54:22 30 4
gpt4 key购买 nike

我们现在有了一种创建惰性变量的新方法。它在 swift-evolution/proposals/0258-property-wrappers.md 中有描述:

@propertyWrapper
enum Lazy<Value> {
case uninitialized(() -> Value)
case initialized(Value)

init(wrappedValue: @autoclosure @escaping () -> Value) {
self = .uninitialized(wrappedValue)
}

var wrappedValue: Value {
mutating get {
switch self {
case .uninitialized(let initializer):
let value = initializer()
self = .initialized(value)
return value
case .initialized(let value):
return value
}
}
set {
self = .initialized(newValue)
}
}
}

它是线程安全的实现吗?如果没有,如何重现非线程安全行为?

最佳答案

我有同样的问题,所以我通过编写一个小测试来测试它,该测试在类中的属性上使用此属性包装器,然后尝试打印出值(自纪元以来的时间)异步(10000 次)并且它爆炸了在wrappedValue 的getter 中的“返回值”行上带有SIGABRT。

我还尝试在不打印的情况下“获取”值(value),但我遇到了同样的问题。

所以我不得不说:不,它不是线程安全的。

编辑:我想补充一点,我在 https://www.onswiftwings.com/posts/atomic-property-wrapper/ 上做了同样的测试并且那个确实是线程安全的,因此您可以使用它作为基础来制作自己的线程安全的“懒惰”。

关于swift - Property Wrapper @Lazy 变量线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58602596/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com