Var 'xxx' 不是并发安全的,因为它是非隔离的全局共享可变状态;这是 Swift 6 中的错误

问题描述 投票:0回答:1

我使用了一些全局变量,只有Integer,可以从多个线程访问。正常情况下只有一个线程写入该变量,但其他线程读取它们。

var xxx: Integer = 0

必须做什么才能使这个变量对于 Swift 6 来说是线程安全的?

有人可以给我一个简单的例子,如何处理我的几个全局变量。这些变量当前不是类/结构的一部分。只有简单的变量。

swift xcode thread-safety swift6
1个回答
0
投票

来自SE-0412

在严格的并发检查下,要求每个全局变量 要么与全球参与者隔离,要么两者兼而有之:

  1. 不变
  2. 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 为你做的编译时线程安全检查。

© www.soinside.com 2019 - 2024. All rights reserved.