需求: 有4个任务, 需要开启多条线程去执行。 有一个特殊任务0, 需要在1,2任务执行完后, 再执行3, 4任务。
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #78492a; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff; min-height: 16.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #703daa }
span.s2 { color: #000000 }
span.s3 { color: #3e1e81 }
span.s4 { color: #d12f1b }
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"-------1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-------2----%@",[NSThread currentThread]);
});
//加入栅栏函数,执行任务0
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff; min-height: 16.0px }
span.s1 { color: #000000 }
span.s2 { color: #ba2da2 }
span.s3 { color: #272ad8 }
span.s4 { color: #3e1e81 }
span.s5 { color: #d12f1b }
dispatch_barrier_async(queue, ^{//不能使用全局队列
NSLog(@"barrier");
});
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff; min-height: 16.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #d12f1b }
span.s3 { color: #703daa }
dispatch_async(queue, ^{
NSLog(@"-------3----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-------4----%@",[NSThread currentThread]);
});
栅栏函数: 拦截前面的并发任务, 等待栅栏函数执行完后 ,再执行后面的并发任务。
警告:栅栏函数不能使用全局队列(global_queue)
dispatch_barrier_async 与 dispatch_barrier_sync的区别:
同步栅栏函数会等待栅栏函数内的任务执行完,再执行后面的主线程或者子线程任务。
异步栅栏函数不会等待栅栏函数内任务执行完,就会执行后面主线程的任务。
异步栅栏函数不会阻塞主线程。
原文地址:https://www.cnblogs.com/dashengios/p/10416063.html