我一直在使用NSLock来同步代码中敏感的部分,但由于必须从锁定它们的线程中解锁,所以一直遇到问题。然后,我发现GCD的DispatchSemaphore似乎也在做同样的事情,并增加了从任何线程发出信号的方便性。不过,我想知道,这种便利是否是以线程安全为代价的。是否应该替换
let lock = NSLock()
lock.lock()
// do things...
lock.unlock()使用
let semaphore = DispatchSemaphore(value: 1)
semaphore.wait()
// do things...
semaphore.signal()或者我会遇到有关线程安全的问题吗?
发布于 2018-07-13 14:20:23
自从提出这个问题以来,我主要转向了另一种锁定代码块的方法:串行分派队列。我就是这样用的:
let queue = DispatchQueue(label: "<your label here>")
queue.async {
// do things...
}默认情况下,队列是串行的,这意味着它充当当块退出时释放的锁。因此,如果您需要锁定一个异步操作,这是不合适的,但在大多数情况下,它是一种魅力。
https://stackoverflow.com/questions/43468647
复制相似问题