美文网首页
dispatch_barrier

dispatch_barrier

作者: 952625a28d0d | 来源:发表于2016-07-19 10:51 被阅读74次
  • dispatch_barrier_sync
   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只能在自己创建的并行队列中使用,并且是同一个队列。

相关文章

网友评论

      本文标题:dispatch_barrier

      本文链接:https://www.haomeiwen.com/subject/gxymjttx.html