侧边栏壁纸
博主头像
钱学超博主等级

火星人,1万小时法则的忠实拥趸。技术宅,象棋和羽毛球爱好者,马拉松PB成绩:4小时零8分。坚持认为算法是计算机的灵魂。喜欢解决问题,喜欢手工,喜欢与朋友们聊天喝酒吹牛X。

  • 累计撰写 88 篇文章
  • 累计创建 475 个标签
  • 累计收到 99 条评论
标签搜索

目 录CONTENT

文章目录

Swift线程同步机制之Semaphore

钱学超
2023-02-20 / 0 评论 / 1 点赞 / 396 阅读 / 572 字 / 正在检测是否收录...
  1. 如果涉及到线程,线程间的同步、处理、线程一定涉及到线程锁。

  2. 在Swift中,GDC已经不再流行,使用起来虽然比较容易理解,但是流程和步骤确实比较麻烦。

  3. 新的包装DispatchQueue,DispatchSemaphore等等,已经非常之完善。可以用来控制线程同步和通讯。

  4. 严格来说,本次要讲的Semaphore,英文本意为:信号、信号量。就是类似线程安全的消息通讯机制。

  5. 使用起来非常简单。

let semaphore = DispatchSemaphore(value: 1)
let queue = DispatchQueue(label:"TestDispathQueue",attributes : .concurrent)
var arr = [Int]()
for i in 0..<10000 {
    queue.async {
        if semaphore.wait(timeout: .distantFuture) == .success {
            arr.append(i)
            semaphore.signal()
        }
    }
}
  1. 以上代码的意思是,开启10000个线程,每个线程干的活儿就是向数组中添加一个数字。

  2. 如果是不使用信号量的方式,上面的代码一定会报错,因为array本身是线程不安全的。

  3. semaphore的使用方法主要就两个:wait、signal,wait的含义是信号量数量减一,signal的含义是信号量数量加一。

  4. 也即是说,signal是发信号,wait是等待后处理信号。

  5. 那么,以上代码中,1万个线程,同时开启获取信号量的方法,此时只有1个(DispatchSemaphore(value: 1)的含义是只有1个坑)线程立即获取执行权,其他线程全部都被卡在wait方法处。如果设置信号量总数为5,那么会有最多5个线程同时获取到执行权。

  6. 拿到执行权的线程,干完了自己的活儿之后,发送一个信号给其他所有线程。signal之后,可以获取执行权的线程数量就增加了1个,那么所有等待的线程中,就会有一个获取到执行权。如此反复。

  7. 这就是信号量的线程同步方式,巧妙使用wait、signal可以轻松实现生产者、消费者模式,轻松实现线程间的隔离和通讯。

  8. 同学们,学废了没有?

1

评论区