let serial_queue: dispatch_queue_t! = dispatch_queue_create("www.baidu.com", DISPATCH_QUEUE_SERIAL)
let concurrent_queue: dispatch_queue_t! = dispatch_queue_create("www.baidu.com", DISPATCH_QUEUE_CONCURRENT)
for index in 1...10 {
dispatch_async(concurrent_queue, {
print(index)
})
}
for index in 1...10000 {
if index == 9999 {
dispatch_barrier_sync(concurrent_queue, {
print("barrier执行完毕")
})
}
}
print("Running on main thread")
for index in 10...20 {
dispatch_async(concurrent_queue, {
print(index)
})
}```
![Paste_Image.png](https://img.haomeiwen.com/i189984/fe94821c26da6bb5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 根据打印结果得出
dispatch_barrier_sync在代码中充当了栏栅的作用,在它之后的代码必须等到之前的执行完毕才会执行,而且会阻塞主线程
- dispatch_barrier_async
```swift
let serial_queue: dispatch_queue_t! = dispatch_queue_create("www.baidu.com", DISPATCH_QUEUE_SERIAL)
let concurrent_queue: dispatch_queue_t! = dispatch_queue_create("www.baidu.com", DISPATCH_QUEUE_CONCURRENT)
for index in 1...10 {
dispatch_async(concurrent_queue, {
print(index)
})
}
for index in 1...10000 {
if index == 9999 {
dispatch_barrier_async(concurrent_queue, {
print("barrier执行完毕")
})
}
}
print("Running on main thread")
for index in 10...20 {
dispatch_async(concurrent_queue, {
print(index)
})
}```
![Paste_Image.png](https://img.haomeiwen.com/i189984/55f8ae75e45f8c1c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 根据以上得出结论
dispatch_barrier_async在代码中也充当了栏栅的作用,阻挡子线程代码的先后顺序,但是并不会阻塞主线程。
之所以使用并行队列来举例,是因为在某种情况下,并行队列中的一些事情需要在另一些事情执行完毕之后再去执行,而串行队列本身就是按照顺序执行的,使用barrier来阻塞就没有意义了。
barrier只能写在同一队列中,如果你在其中一个队列中插入了barrier,则不能指望它在另一个队列中生效,对吧。所以不能在global queue中使用,因为你每用一次global queue系统则会给你分配不同的并行队列,你在其中一个插入barrier,又有什么意义呢?所以barrier只能在自己创建的并行队列中使用,并且是同一个队列。
网友评论