将块并发插入并发队列

Concurrent insertion of blocks into concurrent queue

我想将块A、B、C 添加到全局并发队列中。 紧接着我想向同一个队列添加障碍。

我希望 A、B、C 都按某种顺序被调用,但是当所有块终止时,屏障将被调用。

如何保证不会在这个序列的中间插入额外的块?例如,如果在其他地方我将块 X 部署在同一个队列上,我不希望它在屏障之前执行。

能否在 MacOS 和 iOS 上使用相同的解决方案?

障碍不适用于全局队列。创建您自己的自定义并发队列。正如 dispatch_barrier_async documentation 所说:

The queue you specify should be a concurrent queue that you create yourself using the dispatch_queue_create function. If the queue you pass to this function is a serial queue or one of the global concurrent queues, this function behaves like the dispatch_async function.

然后在屏障之后分派到该队列的任何东西都不会 运行 直到屏障之后。所以派遣 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"); 
});