Phl*_*man 8 concurrency swift swift3
我一直在使用NSLocks来同步敏感的代码部分,但由于它们必须从锁定它们的同一个线程中解锁而一直遇到问题.然后我发现GCD DispatchSemaphore似乎做了同样的事情,增加了方便性,可以从任何线程发出信号.不过,我想知道,如果这种便利是以线程安全为代价的.更换是否可取
let lock = NSLock()
lock.lock()
// do things...
lock.unlock()
Run Code Online (Sandbox Code Playgroud)
同
let semaphore = DispatchSemaphore(value: 1)
semaphore.wait()
// do things...
semaphore.signal()
Run Code Online (Sandbox Code Playgroud)
或者我会遇到有关线程安全的问题吗?
小智 7
是的,它们具有相同的功能,都可以处理生产者-消费者问题。
如果相应配置,信号量允许多个线程访问共享资源。您可以在同一个并发 dispatchQueue 中执行块。
{
semaphore.wait()
// do things...
semaphore.signal()
}
Run Code Online (Sandbox Code Playgroud)
实际上这同样适用于 Lock,如果您只想让一个线程以并发方式一次接触资源。
我发现这很有帮助:https : //priteshrnandgaonkar.github.io/concurrency-with-swift-3/