看了很多文章,总有自己的一套。套套不同。
case1
在开发中,我们经常会用到针对一个数据存储的多读单写功能。dispatch_barrier_async就能实现该功能,保证你在读的过程中可以多并发,写的过程中可以阻塞其他操作。
https://www.jianshu.com/p/2d25ad26680d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
case2
怎样实现多读单写?
比如在内存中维护一份数据,有多处地方可能会同时操作这块数据,怎么能保证数据安全?
1.读写互斥
2.写写互斥
3.读读并发
要想满足上面的三点该怎么实现呢?
https://www.jianshu.com/p/be2e405f952c
case3
首先,我们需要创建一个私有的并行队列来处理读写操作。
在这里不应该使用globe_queue, 因为我们通过dispatch_barrier_async来保证写操作的互斥,我们不希望写操作阻塞住globe_queue中的其他不相关任务,我们只希望在写的同时,不会有其他的写操作或者读操作。
同时,也不推荐给队列设置优先级,多数情况下使用default就可以了。而改变优先级往往会造成一些无法预料的问题,比如优先级反转(具体的可以参看参考文献)。
dispatch_barrier_async的block运行时机是,在它之前所有的任务执行完毕,并且在它后面的任务开始之前,期间不会有其他的任务执行。注意在barrier执行的时候,队列本质上如同一个串行队列,其执行完以后才会恢复到并行队列。
另外一个值得注意的问题是,在写操作的时候,我们使用dispatch_async,而在读操作的时候我们使用dispatch_sync。很明显,这2个操作一个是异步的,一个是同步的。我们不需要使每次程序执行的时候都等待写操作完成,所以写操作异步执行,但是我们需要同步的执行读操作来保证程序能够立刻得到它想要的值。(写操作是异步,不需要等待结果,直接返回;读操作是同步,需要等待读结果,是同步)。
网友评论