我一直在使用NSLock
来同步敏感的代码部分,但由于它们必须从锁定它们的同一个线程中解锁,所以一直在遇到问题。然后我发现GCD的DispatchSemaphore
似乎做了同样的事情,增加了方便性,可以从任何线程发出信号。不过,我想知道,如果这种便利是以线程安全为代价的。是否可取代
let lock = NSLock()
lock.lock()
// do things...
lock.unlock()
与
let semaphore = DispatchSemaphore(value: 1)
semaphore.wait()
// do things...
semaphore.signal()
或者我是否会遇到有关线程安全的问题?
答案 0 :(得分:3)
是的,它们具有相同的功能,既可以解决生产者 - 消费者问题。
如果相应地配置了信号量,则允许多个线程访问共享资源。您可以在同一个并发dispatchQueue中执行块。
{semaphore.wait()
// do things...
semaphore.signal()}
实际上,如果您只希望一个线程以并发方式一次触摸资源,则同样适用于Lock。
我发现这有用:https://priteshrnandgaonkar.github.io/concurrency-with-swift-3/
答案 1 :(得分:1)
自从提出这个问题以来,我基本上已经切换到另一种锁定代码块的方式:串行调度队列。我这样使用它:
partData[1][2].toString().replace(/ /g,'')==name.toString().replace(/ /g,'')
默认情况下,队列是串行的,这意味着它充当退出该块时释放的锁。因此,如果您需要锁定异步操作是不合适的,但是在大多数情况下,它很吸引人。