- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我一直在使用 NSLock
来同步敏感的代码部分,但一直遇到问题,因为它们必须从锁定它们的同一线程解锁。然后我发现 GCD 的 DispatchSemaphore
似乎在做同样的事情,而且更方便的是它们可以从任何线程发出信号。不过,我想知道这种便利是否是以线程安全为代价的。是否建议更换
let lock = NSLock()
lock.lock()
// do things...
lock.unlock()
与
let semaphore = DispatchSemaphore(value: 1)
semaphore.wait()
// do things...
semaphore.signal()
还是我会遇到有关线程安全的问题?
最佳答案
是的,它们具有相同的功能,都是处理生产者-消费者问题。
如果相应配置,信号量允许多个线程访问共享资源。您可以在同一个并发 dispatchQueue 中执行 block 。
{
semaphore.wait()
// do things...
semaphore.signal()
}
实际上这同样适用于 Lock,如果您只希望一个线程以并发方式一次访问资源。
我发现这很有用:https://priteshrnandgaonkar.github.io/concurrency-with-swift-3/
关于swift - DispatchSemaphore 是 NSLock 的良好替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43468647/
我有一个看起来像这样的值 lazy var authHeaders: [String: String] = { if shouldTokenBeRefreshed() {
显然,如果我处理不同的队列,我只能使用 DispatchSemaphore。但是,如果我想在同一队列(在本例中为主队列)上运行异步代码怎么办? let s = DispatchSemaphore(va
我创建了一个函数 getFriends,它从 firestore 中读取用户的好友列表,并将每个好友放入 LocalUser 对象(这是我的自定义用户类)中,以便在表格 View 中显示好友列表。我需
所以我一直在尝试使用 NetworkExtension 来制作玩具 VPN 实现,但我遇到了完成处理程序/异步运行代码的问题。我将引导您完成我的思路/实验,如果您能指出我错误的地方以及如何解决此问题,
我一直在使用 NSLock 来同步敏感的代码部分,但一直遇到问题,因为它们必须从锁定它们的同一线程解锁。然后我发现 GCD 的 DispatchSemaphore 似乎在做同样的事情,而且更方便的是它
想象一个屏幕 S。用户到达 S,看东西。有一个按钮 B ... | | | B| | | | | 当你按下 B .. func clickedB() { blockingS
我得到了三个分派(dispatch)线程,名为 queueA、queueB、queueC。 现在我希望在 queueB 和 queueC 完成后执行 queueA。 所以我尝试通过DispatchSe
vc1 插入 vc2 并进入 vc2。 在 vc2 中,我有一个字符串数组,我将其转换为 url,最终通过 URLSession,返回的图像将转换为带有过滤器的图像。一旦我在 URLSession 回
我试图在方法外使用一些 json 响应,但在执行方法时它返回空数组,但在 block 内按预期工作,我的方法是否有任何方式返回预期值,这是我的示例代码: func getCarouselContent
我想在 swift 中按顺序运行一个 for 循环,DispatchGroup 会一起触发它们,所以我想使用 DispatchQueue 和 DispatchSemaphore 来实现我的目标。我的程
我是一名优秀的程序员,十分优秀!