@synchronized vs GCD dispatch_barrier_async

时间:2012-08-12 15:10:56

标签: objective-c concurrency grand-central-dispatch

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

然而,我遇到的是多线程读取和写入相同对象的挑战。在this question我得到了this fine answer,这让我要求所有人确认,以确保我了解@synchronizedGCD dispatch_barrier_async的利弊。

这就是我看到它的方式:

 @synchronized

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

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

 `dispatch_barrier_async` with custom DISPATCH_QUEUE_CONCURRENT

PRO :比@synchronized快

CON :DISPATCH_QUEUE_CONCURRENT仅在iOS 5中提供(如here所述),因此无法支持iOS 4

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

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

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

1 个答案:

答案 0 :(得分:3)

嗯,有几点要指出:

1)当你使用@synchronized时,它会为应用程序提供适用于iOS(或OSX)的WHOLE异常框架。我在OSX上知道这个并且它在那里有性能影响,不能在iOS上肯定地说但是期望相同。也就是说,这是使用大锤驱动钉子 - 在其他选项可用之前,这种能力已经存在。我个人避免使用像瘟疫一样,并移植其他开源框架来使用调度信号量(我感谢Mike Ash(再次)!)

2)您对“DISPATCH_QUEUE_CONCURRENT”的评论是排序的红色鲱鱼 - 自从iOS 4以来,系统已经为您提供了3个并发队列,因此如果您需要定义自己的队列,那么您真的正在推动它。使用dispatch,您可以拥有异步和同步,串行和并发,可以等待的组,然后再发送。这里有如此丰富的你怎么能想到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)