首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发插入块到并发队列中

并发插入块到并发队列中
EN

Stack Overflow用户
提问于 2019-07-27 15:02:15
回答 1查看 108关注 0票数 1

我想在全局并发队列中添加块A、B、C。在此之后,我想立即在同一队列中添加屏障。

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

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

同样的解决方案可以在MacOS和iOS上使用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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上的工作方式。只需创建您自己的自定义并发队列即可。

代码语言:javascript
复制
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"); 
});
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57233343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档