我想将块A,B,C添加到全局并发队列中。之后,我想立即向同一队列添加障碍。
我希望A,B,C都以某种顺序调用,但是当所有块终止时,将调用该屏障。
如何保证在此序列的中间不会插入其他块?例如,如果在其他地方我将块X部署在同一队列中,则我不希望在屏障之前执行它。
MacOS和iOS上都可以使用相同的解决方案吗?
障碍不适用于全局队列。创建自己的自定义并发队列。如dispatch_barrier_async
文档所述:
您指定的队列应该是使用该
dispatch_queue_create
函数创建的并发队列。如果传递给此函数的队列是串行队列或全局并发队列之一,则此函数的行为类似于该dispatch_async
函数。
然后,任何在屏障之后调度到该队列的内容都不会运行,直到屏障之后。因此,分派A,B和C。然后以障碍物分派D。然后调度X。A,B和C将相对于彼此同时运行,完成后,D将运行,而完成D之后,X将运行。在macOS和iOS上都是这样。只需创建自己的自定义并发队列即可。
dispatch_queue_t queue = dispatch_queue_create("com.company.app.queue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSLog(@"start - A!\n"); sleep(4); NSLog(@"end - A!\n"); }); dispatch_async(queue, ^{ NSLog(@"start - B!\n"); sleep(2); NSLog(@"end - B!\n"); }); dispatch_async(queue, ^{ NSLog(@"start - C!\n"); sleep(3); NSLog(@"end - C!\n"); }); dispatch_barrier_async(queue, ^{ NSLog(@"Barrier - D\n"); }); dispatch_async(queue, ^{ NSLog(@"start - X!\n"); sleep(3); NSLog(@"end - X!\n"); });