@synchronized vs GCD dispatch_barrier_async

joh*_*ers 11 concurrency objective-c grand-central-dispatch

我已经开始第一次控制队列了,感觉我对如何使用它们有很好的把握,并且对Apple的称赞让它们非常简单易用.

然而,我遇到的是多线程读取和写入相同对象的挑战.在这个问题中,我得到了这个很好的答案,这让我要求每个人都做出一些确认,以确保我理解@synchronizedvs 的优点和缺点GCD dispatch_barrier_async.

这是我看到它的方式:

 @synchronized
Run Code Online (Sandbox Code Playgroud)

PRO:@synchronized只要您有访问/指针,就可以包装任何对象,从而可以轻松地从程序中的不同对象安全地处理共享数据模型

PRO:iOS 4支持(可能更早)

 `dispatch_barrier_async` with custom DISPATCH_QUEUE_CONCURRENT
Run Code Online (Sandbox Code Playgroud)

PRO:比@synchronized更快

CON:(如所讨论的仅DISPATCH_QUEUE_CONCURRENT在IOS 5可用在这里),因此没有可用的支撑iOS 4的

CON:当控制来自许多其他对象的对象的读/写时,并不容易使用,因为队列最容易只对创建它们的对象可用(没有一些工作来解决这个限制)

总之,考虑到上述情况,最好的工具取决于程序的需要.

如果有人要添加或指出,我会很感激.

Dav*_*d H 4

嗯,有几点需要指出:

1)当您使用@synchronized时,它会为应用程序引入iOS(或OSX)的整个异常框架。我在 OSX 上知道这一点,并且它对性能有影响,在 iOS 上不能肯定地说,但希望也是如此。也就是说,这是用大锤敲钉子——这种能力早在其他选择出现之前就已经存在了。我个人像瘟疫一样避免使用它,并移植了其他开源框架来使用调度信号量(我(再次)为此感谢 Mike Ash!)

2)你对“DISPATCH_QUEUE_CONCURRENT”的评论有点转移注意力——从iOS 4开始,系统给了你3个并发队列,所以如果你需要定义自己的队列,你真的是在挑战极限。通过调度,您可以拥有异步和同步、串行和并发、可以等待并调度的组。这里有如此丰富的内容,你怎么能想到1)。您使用块的次数越多,您就会使用它们越多!

编辑:我在 iOS 4.3 应用程序中使用了自定义并发队列,以及所有 Mike Ash 屏障技术。queue.h 文件将其显示为可用:

__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW
dispatch_queue_t
dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags);

/*!
 * @const DISPATCH_QUEUE_SERIAL
 * @discussion A dispatch queue that invokes blocks serially in FIFO order.
 */
#define DISPATCH_QUEUE_SERIAL NULL

/*!
 * @const DISPATCH_QUEUE_CONCURRENT
 * @discussion A dispatch queue that may invoke blocks concurrently and supports
 * barrier blocks submitted with the dispatch barrier API.
 */
#define DISPATCH_QUEUE_CONCURRENT (&_dispatch_queue_attr_concurrent)
Run Code Online (Sandbox Code Playgroud)

  • 您的第2)点不适用于dispatch_barrier,因为您不能在全局队列上使用它,只能在自定义并发队列上使用它。对于使用GCD机制的线程安全读/写,您需要一个自定义并发队列。此处描述:http://www.mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html (2认同)