我使用了一些全局变量,只有Integer,可以从多个线程访问。正常情况下只有一个线程写入该变量,但其他线程读取它们。
var xxx: Integer = 0
必须做什么才能使这个变量对于 Swift 6 来说是线程安全的?
有人可以给我一个简单的例子,如何处理我的几个全局变量。这些变量当前不是类/结构的一部分。只有简单的变量。
来自SE-0412,
在严格的并发检查下,要求每个全局变量 要么与全球参与者隔离,要么两者兼而有之:
- 不变
类型Sendable
由于您的变量必须是
var
,因此它必须与全局参与者隔离。您可以使用现有的全局参与者,例如 @MainActor
:
@MainActor
var x = 0
或者编写你自己的全局演员
@globalActor
public struct SomeGlobalActor {
public actor MyActor { }
public static let shared = MyActor()
}
@SomeGlobalActor
var x = 0
无论哪种情况,您都需要一个
await
才能从未与全局参与者隔离的上下文中访问它。
最后,如果你想以自己的方式同步访问这个全局变量,你可以这样做:
nonisolated(unsafe) var x = 0
这放弃了 Swift 为你做的编译时线程安全检查。