美文网首页
iOS高级进阶之多线程(三) 信号量

iOS高级进阶之多线程(三) 信号量

作者: iOS刘耀宗 | 来源:发表于2021-06-19 10:49 被阅读0次

项目 Demo 下载
信号量的初始值,可以用来控制线程并发访问的最大数量
信号量的初始值为 1. 代表只允许 1 条线程访问资源,保证线程同步
常用的使用场景:
1.处理线程安全.保证线程同步
2.多个网络请求同步请求.

image.png
模拟火车卖票.线程不安全
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        //全局队列,并发
        let queue = DispatchQueue.global()
        var index: Int = 0
        for _ in 0...10 {
            queue.async {
                self.soldTicket()
            }
            index += 1
        }
        
    }
    
    //卖票
    func soldTicket() {
        sleep(1)
        total -= 1;
        print("卖掉一张票,剩余\(total)张")
    }
卖票打印结果.png
模拟火车卖票.线程安全

 //票的总数
    var total: Int = 20
    
    var lock: NSLock = NSLock()
    
    let sem = DispatchSemaphore(value: 1)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        //全局队列,并发
        let queue = DispatchQueue.global()
        var index: Int = 0
        for _ in 0...10 {
            queue.async {
                 //如果信号量>0 .那么信号量-1 .执行下句代码
                self.sem.wait()
                self.soldTicket()
                //信号量+1
                self.sem.signal()
            }
            index += 1
        }
        
    }
    
    //卖票
    func soldTicket() {
        sleep(1)
        total -= 1;
        print("卖掉一张票,剩余\(total)张")
    }
image.png
模拟多个网络请求同步请求
func syncDemo() {
        var index: Int = 0
        let queue = DispatchQueue.global()
        for _ in 0...10 {
            self.sem.wait()
            queue.async {
                let queue = DispatchQueue(label: "")
                queue.asyncAfter(deadline: DispatchTime.now() + 2, execute: {
                    print("index = \(index)");
                    self.sem.signal()
                })
            }
            index += 1
        }
    }
网络异步请求同步执行.png

相关文章

网友评论

      本文标题:iOS高级进阶之多线程(三) 信号量

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