【发布时间】:2021-11-11 16:18:10
【问题描述】:
流行的 Concurrent-Ruby 库有一个我觉得很棒的 Concurrent::Event class。它非常巧妙地封装了“一些线程需要等待另一个线程完成某事才能继续执行”的思想。
只需三行代码即可使用:
- 一个创建对象
- 拨打
.wait开始等待,然后 - 事情准备就绪后,可以致电
.set。
您需要使用其他并发原语创建它的所有锁和布尔值都已为您处理好了。
引用一些文档以及示例用法:
老派内核风格的事件让人想起 C++ 中的 Win32 编程。
创建
Event时,它处于unset状态。线程可以选择#wait事件,阻塞直到被另一个线程释放。当一个 线程想要提醒它调用#set方法的所有阻塞线程 然后将唤醒所有听众。一旦设置了Event,它就会保持设置状态。 调用#wait的新线程将立即返回。require 'concurrent-ruby' event = Concurrent::Event.new t1 = Thread.new do puts "t1 is waiting" event.wait puts "event ocurred" end t2 = Thread.new do puts "t2 calling set" event.set end [t1, t2].each(&:join)
打印输出如下
t1 is waiting
t2 calling set
event occurred
(由于它是多线程的,因此可能有几种不同的顺序,但“t2调用集”总是在“事件发生”之前出现。)
在 iOS 上的 Swift 中有类似的东西吗?
【问题讨论】:
-
这类似于在并行调度队列上使用调度工作,由 disoatch 组协调。但这并不是一个非常有趣的模式,它非常低级且容易出错。你最好使用 RxSwift/Combine 中的 observable/publishers
标签: ios swift multithreading concurrency