讨论下
dispatch_barrier_sync `Submits a barrier block object for execution and waits until that block completes.`
dispatch_barrier_async `Submits a barrier block for asynchronous execution and returns immediately.`
dispatch_barrier_sync
NSLog(@"start");
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@---i = %d",[NSThread currentThread], i);
}
});
dispatch_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@---j = %d",[NSThread currentThread], i);
}
});
dispatch_barrier_sync(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@dispatch_barrier_sync-k = %d",[NSThread currentThread], i);
}
});
NSLog(@"mainQueue");
dispatch_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@---m = %d",[NSThread currentThread], i);
}
});
dispatch_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@---n = %d",[NSThread currentThread], i);
}
});
结果输出
2018-12-01 22:36:45.434258+0800 dispatch_barrier-Demo[49756:2281229] start
2018-12-01 22:36:46.435504+0800 dispatch_barrier-Demo[49756:2281280] <NSThread: 0x604000465300>{number = 4, name = (null)}---j = 0
2018-12-01 22:36:46.435535+0800 dispatch_barrier-Demo[49756:2281279] <NSThread: 0x60000026b9c0>{number = 3, name = (null)}---i = 0
2018-12-01 22:36:47.436364+0800 dispatch_barrier-Demo[49756:2281280] <NSThread: 0x604000465300>{number = 4, name = (null)}---j = 1
2018-12-01 22:36:47.436378+0800 dispatch_barrier-Demo[49756:2281279] <NSThread: 0x60000026b9c0>{number = 3, name = (null)}---i = 1
2018-12-01 22:36:48.437197+0800 dispatch_barrier-Demo[49756:2281280] <NSThread: 0x604000465300>{number = 4, name = (null)}---j = 2
2018-12-01 22:36:48.437197+0800 dispatch_barrier-Demo[49756:2281279] <NSThread: 0x60000026b9c0>{number = 3, name = (null)}---i = 2
2018-12-01 22:36:49.438991+0800 dispatch_barrier-Demo[49756:2281229] <NSThread: 0x60400006fb80>{number = 1, name = main}dispatch_barrier_sync-k = 0
2018-12-01 22:36:50.440638+0800 dispatch_barrier-Demo[49756:2281229] <NSThread: 0x60400006fb80>{number = 1, name = main}dispatch_barrier_sync-k = 1
2018-12-01 22:36:51.441571+0800 dispatch_barrier-Demo[49756:2281229] <NSThread: 0x60400006fb80>{number = 1, name = main}dispatch_barrier_sync-k = 2
2018-12-01 22:36:51.441938+0800 dispatch_barrier-Demo[49756:2281229] mainQueue
2018-12-01 22:36:52.446690+0800 dispatch_barrier-Demo[49756:2281280] <NSThread: 0x604000465300>{number = 4, name = (null)}---n = 0
2018-12-01 22:36:52.446690+0800 dispatch_barrier-Demo[49756:2281279] <NSThread: 0x60000026b9c0>{number = 3, name = (null)}---m = 0
2018-12-01 22:36:53.448285+0800 dispatch_barrier-Demo[49756:2281280] <NSThread: 0x604000465300>{number = 4, name = (null)}---n = 1
2018-12-01 22:36:53.448285+0800 dispatch_barrier-Demo[49756:2281279] <NSThread: 0x60000026b9c0>{number = 3, name = (null)}---m = 1
2018-12-01 22:36:54.452850+0800 dispatch_barrier-Demo[49756:2281280] <NSThread: 0x604000465300>{number = 4, name = (null)}---n = 2
2018-12-01 22:36:54.452852+0800 dispatch_barrier-Demo[49756:2281279] <NSThread: 0x60000026b9c0>{number = 3, name = (null)}---m = 2
很明显,这个dispatch_group有异曲同工之妙
dispatch_barrier_async
NSLog(@"start");
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@---i = %d",[NSThread currentThread], i);
}
});
dispatch_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@---j = %d",[NSThread currentThread], i);
}
});
dispatch_barrier_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@dispatch_barrier_async-k = %d",[NSThread currentThread], i);
}
});
NSLog(@"mainQueue");
dispatch_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@---m = %d",[NSThread currentThread], i);
}
});
dispatch_async(queue, ^{
for (int i=0; i<3; i++) {
sleep(1);
NSLog(@"%@---n = %d",[NSThread currentThread], i);
}
});
结果输出
2018-12-01 22:39:59.571218+0800 dispatch_barrier-Demo[49821:2286672] start
2018-12-01 22:39:59.571634+0800 dispatch_barrier-Demo[49821:2286672] mainQueue
2018-12-01 22:40:00.576732+0800 dispatch_barrier-Demo[49821:2286715] <NSThread: 0x60400027c0c0>{number = 4, name = (null)}---i = 0
2018-12-01 22:40:00.576753+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}---j = 0
2018-12-01 22:40:01.581673+0800 dispatch_barrier-Demo[49821:2286715] <NSThread: 0x60400027c0c0>{number = 4, name = (null)}---i = 1
2018-12-01 22:40:01.581680+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}---j = 1
2018-12-01 22:40:02.582256+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}---j = 2
2018-12-01 22:40:02.582256+0800 dispatch_barrier-Demo[49821:2286715] <NSThread: 0x60400027c0c0>{number = 4, name = (null)}---i = 2
2018-12-01 22:40:03.585238+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}dispatch_barrier_async-k = 0
2018-12-01 22:40:04.588562+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}dispatch_barrier_async-k = 1
2018-12-01 22:40:05.593231+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}dispatch_barrier_async-k = 2
2018-12-01 22:40:06.598600+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}---m = 0
2018-12-01 22:40:06.598617+0800 dispatch_barrier-Demo[49821:2286715] <NSThread: 0x60400027c0c0>{number = 4, name = (null)}---n = 0
2018-12-01 22:40:07.600451+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}---m = 1
2018-12-01 22:40:07.600451+0800 dispatch_barrier-Demo[49821:2286715] <NSThread: 0x60400027c0c0>{number = 4, name = (null)}---n = 1
2018-12-01 22:40:08.605899+0800 dispatch_barrier-Demo[49821:2286715] <NSThread: 0x60400027c0c0>{number = 4, name = (null)}---n = 2
2018-12-01 22:40:08.605901+0800 dispatch_barrier-Demo[49821:2286714] <NSThread: 0x6000004799c0>{number = 3, name = (null)}---m = 2
网友评论