将块并发插入并发队列
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");
});
我想将块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 thedispatch_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");
});