//写入处理不可以与写入处理和读取处理并行执行。读取处理与读取处理可并行执行
//为了高效率的进行访问:
//读取处理追加到Concurrent Dispatch Queue中,写入处理在任一个读取处理没有执行的状态下,追加到Serial Dispatch Queue中即可,在写入处理结束之前,读取处理不可执行。
//通过dispatch_barrier_async也可实现
dispatch_queue_t queue = dispatch_queue_create("Dispatch Queue的名称", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{/*读取处理0*/});
dispatch_async(queue, ^{/*读取处理1*/});
dispatch_async(queue, ^{/*读取处理2*/});
dispatch_async(queue, ^{/*读取处理3*/});
//写入处理,之后会对写入的内容进行读取处理
//若简单的在dispatch_async函数中加入写入处理,那么根据Concurrent Dispatch Queue的性质,就有可能在追加到写入处理前面的处理中读取到与期待不符的数据,还可能因非法访问导致应用程序异常结束。如果追加多个写入处理,则可能发生更多问题,比如数据竞争。
//通过dispatch_barrier_async函数会等待追加到Concurrent Dispatch Queue上的并行执行的处理全部结束之后,再将指定的处理(异步)追加到该Concurrent Dispatch Queue中。然后在由dispatch_barrier_async函数追加的处理执行完毕后,Concurrent Dispatch Queue才恢复为一般的动作,追加到该Concurrent Dispatch Queue的处理又开始并行执行。
dispatch_barrier_async(queue, ^{/*写入处理*/});
dispatch_async(queue, ^{/*读取处理4*/});
dispatch_async(queue, ^{/*读取处理5*/});
dispatch_async(queue, ^{/*读取处理6*/});
dispatch_async(queue, ^{/*读取处理7*/});
//dispatch_barrier_sync函数与dispatch_barrier_async不同的地方是它会将指定的block同步追加到Concurrent Dispatch Queue中。在追加Block结束之前,dispatch_barrier_sync函数会一直等待。即dispatch_barrier_async不阻塞当前线程,dispatch_barrier_sync阻塞当前线程。