我想在全局并发队列中添加块A、B、C。在此之后,我想立即在同一队列中添加屏障。
我希望A,B,C都会按某种顺序被调用,但是当所有块终止时,屏障就会被调用。
如何保证在这个序列的中间不会插入任何额外的块?例如,如果在其他地方我在同一个队列上部署了块X,我不希望它在屏障之前执行。
同样的解决方案可以在MacOS和iOS上使用吗?
发布于 2019-07-27 16:25:26
障碍在全球队列中不起作用。创建您自己的自定义并发队列。正如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");
});https://stackoverflow.com/questions/57233343
复制相似问题