gpt4 book ai didi

ios - 将 block 并发插入并发队列

转载 作者:行者123 更新时间:2023-12-03 16:52:14 24 4
gpt4 key购买 nike

我想将 block A、B、C 添加到全局并发队列中。之后我想立即向同一个队列添加屏障。

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

如何保证在此序列的中间不会插入任何附加 block ?例如,如果我在其他地方将 block 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.

然后,在屏障之后分派(dispatch)到该队列的任何内容都不会在屏障之后运行。因此调度 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");
});

关于ios - 将 block 并发插入并发队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com