-
Notifications
You must be signed in to change notification settings - Fork 213
Open
Description
文章在此。
在 Swift 中,对类的成员直接用 &member 是不安全的,Apple 工程师在 Apple Developer 论坛里有提过。
简单来说 Swift 可能会把
class AtomicCounter {
var count: Int32 = 0
func increment() {
OSAtomicAdd32(1, &count)
}
}展开成
class AtomicCounter {
var count: Int32 = 0
func increment() {
var tmp = count
OSAtomicAdd32(1, &tmp)
count = tmp
}
}如果改成 os_unfair_lock,就有可能每次传给系统一个临时变量在栈上的地址,而内核是根据内存地址来鉴别锁的。
若要安全使用,必须使用指针(UnsafePointer 家族)手工分配一个地址,初始化,并在 deinit 里记得释放。这样会造成一次额外的内存寻址……之前 Swift 论坛上有标准库的人(@lorentey)在推这个问题的解决方案,但是似乎没有下文了。
Metadata
Metadata
Assignees
Labels
No labels