Actor重入性控制与死锁预防
深入actor的挂起点与重入行为,演示如何通过明确状态机避免数据竞争和隐式死锁。 · 难度:入门 · +10XP
Actor重入性控制与死锁预防
Actor在遇到await时允许其他任务执行,这称为重入。不当的重入可能导致状态不一致或死锁。本教程教你如何利用actor隔离和状态枚举,设计出可预测的重入行为。你将实现一个资源管理器,通过显式状态转换与优先级队列,避免常见的重入陷阱。
actor ResourceManager {
enum State {
case idle
case loading(Task)
case loaded(Data)
}
private var state: State = .idle
func fetchResource() async -> Data {
switch state {
case .loaded(let data):
return data
case .loading(let task):
return await task.value
case .idle:
let task = Task {
// 模拟网络请求
return Data()
}
state = .loading(task)
let data = await task.value
state = .loaded(data)
return data
}
}
}