Swift GCD DispatchSemaphore

信号量处理事件并发 用来控制资源被多任务访问的情况 亲测有效

let semaphore = DispatchSemaphore(value: 1) 初始化信号量为1
semaphore.wait()  信号量-1 当前信号量为0 所有操作处于等待状态 不再执行
semaphore.signal() 当前信号量为1 所有操作处于可执行状态 开始执行
        let queue = DispatchQueue.global()
        let group = DispatchGroup()
        let semaphore = DispatchSemaphore(value: 1)
        
        queue.async(group: group) {
            semaphore.wait()
            self.semaphoreTask(label: "1", cost: 2, complete: {
                semaphore.signal()
            })
        }
        queue.async(group: group) {
            semaphore.wait()
            self.semaphoreTask(label: "2", cost: 2, complete: {
                semaphore.signal()
            })
        }
        queue.async(group: group) {
            semaphore.wait()
            self.semaphoreTask(label: "3", cost: 2, complete: {
                semaphore.signal()
            })
        }
        
        group.notify(queue: queue) {
            print("All task has finished")
        }

延迟方法

public func semaphoreTask(label:String, cost:UInt32, complete:@escaping ()->()){
        print("Start semaphore task \(label)")
        sleep(cost)
        print("End semaphore task  \(label)")
        complete()
    }

日志输出

Start semaphore task 1
End semaphore task 1
Start semaphore task 2
End semaphore task 2
Start semaphore task 3
End semaphore task 3
All task has finished
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,885评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 13,054评论 2 59
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,056评论 2 89
  • 每到周五就开始想周末做什么,可是到了周末,却经常在各种睡觉和吃饭,追剧中度过。 所以看到这本书名的时候就很好...
    苏苏姑娘阅读 1,200评论 0 2
  • 神秘的布达拉宫 文‖云飞扬 仰望布达拉宫 在这尘世,是那装满双眼的神秘 多少虔诚的的祈祷 在你的圣殿被折叠皈依 你...
    山东云飞扬阅读 326评论 0 3