并发安全可变共享状态:Actor 与 Mutex 的混合策略
在 Actor 内部使用 UnsafeMutablePointer 和 os_unfair_lock 实现高性能读写分离。 · 难度:入门 · +10XP
并发安全可变共享状态:Actor 与 Mutex 的混合策略
Actor 提供全同步的互斥访问,但读多写少场景下性能不佳。本教程展示如何在 Actor 内部组合使用 os_unfair_lock(写锁)和原子操作(读),实现写时锁定、读时无锁的共享缓存。同时利用 @globalActor 将整个实例的读取操作标记为无锁,仅在写入时切换到 Actor 上下文。
actor FastCache<Key: Hashable, Value> {
private var storage: [Key: Value] = [:]
private var readCount = UnsafeMutablePointer<Int>.allocate(capacity: 1)
func read(_ key: Key) -> Value? {
atomicAdd(readCount, 1) // 读计数器原子增加
defer { atomicSub(readCount, 1) }
return storage[key] // 注意:此处仍需要内存屏障
}
func write(_ key: Key, value: Value) {
storage[key] = value
}
}