在Swift 3 中的 GCD 并发编程中,他们警告我们不能os_unfair_lock直接在 Swift 中使用,因为“Swift 假定任何东西struct都可以移动,并且不能使用互斥锁或锁。”
在该视频中,演讲者建议,如果您必须使用os_unfair_lock,请将其放在 Objective-C 类中(不会移动struct)。或者,如果您查看一些stdlib 代码,它们会显示您可以留在 Swift 中,但使用 aUnsafeMutablePointer代替struct直接。(感谢 bscothern确认此模式。)
因此,例如,您可以编写一个UnfairLock类来避免此问题:
final class UnfairLock: NSLocking {
private let unfairLock: UnsafeMutablePointer<os_unfair_lock> = {
let pointer = UnsafeMutablePointer<os_unfair_lock>.allocate(capacity: 1)
pointer.initialize(to: os_unfair_lock())
return pointer
}()
deinit {
unfairLock.deinitialize(count: 1)
unfairLock.deallocate()
}
func lock() {
os_unfair_lock_lock(unfairLock)
}
func tryLock() -> Bool {
os_unfair_lock_trylock(unfairLock)
}
func unlock() {
os_unfair_lock_unlock(unfairLock)
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以做这样的事情:
let lock = UnfairLock()
Run Code Online (Sandbox Code Playgroud)
然后像你一样使用lockand ,但在幕后使用更有效的:unlockNSLockos_unfair_lock
lock.lock()
// critical section here
lock.unlock()
Run Code Online (Sandbox Code Playgroud)
并且因为这符合NSLocking,您可以使用为此设计的扩展。例如,这是我们用来保证锁定和解锁平衡的常用方法:
extension NSLocking {
func synchronized<T>(block: () throws -> T) rethrows -> T {
lock()
defer { unlock() }
return try block()
}
}
Run Code Online (Sandbox Code Playgroud)
和
lock.synchronized {
// critical section here
}
Run Code Online (Sandbox Code Playgroud)
但是,最重要的是,不要os_unfair_lock在没有类似上述内容的情况下使用Swift 或该视频中的预期内容,这两者都为锁提供了稳定的内存地址。
Kam*_*ran -3
您可以os_unfair_lock按如下方式使用,
var unfairLock = os_unfair_lock_s()
os_unfair_lock_lock(&unfairLock)
os_unfair_lock_unlock(&unfairLock)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |