objective-c – @synchronized对GCD dispatch_barrier_async

我已经开始第一次控制队列,觉得我有一个很好的处理方法,如何使用它们,并且让苹果对Apple非常直接的使用.

然而,我遇到的是多线程读取和写入相同对象的挑战.在this question,我得到了this fine answer,它让我要求每个人的确认,以确保我了解@synchronized对GCD 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)当您使用@synchronized时,它将为iOS(或OSX)提供一个应用程序的全局异常框架.我在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)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...