在 Objective-c 中,(至少)有两种方法可以同步对共享资源的并发访问。较旧的基于锁的方法和带有 Grand Central Dispatch (GCD) 的较新方法,后者使用 dispatch_sync 将所有访问分派到共享队列。
在Concurrency Programming Guide 的 Elimination Lock-Based Code 一节中,它指出“使用锁是有代价的。即使在没有争议的情况下,使用锁总是会带来性能损失。”
这是 GCD 方法的有效论据吗?
我认为不是以下原因:
队列必须有一个队列任务列表来执行。一个或多个线程可以通过 dispatch_sync 将任务添加到此列表中,并且一个或多个工作线程需要从该列表中删除元素才能执行任务。这必须由锁保护。所以那里也需要锁。
请告诉我是否有任何其他方式队列可以在没有我不知道的锁的情况下执行此操作。
更新:在指南的进一步内容中,暗示有一些我不知道的事情:“排队任务不需要陷入内核来获取互斥锁。”
这是如何运作的?