Replies: 3 comments 7 replies
-
我对有界队列的使用场景不太熟悉。但看上去使用协程 condition_variable 等组件看上去并不太好。所谓协程性能好的假设是我们可以将等IO/等阻塞所浪费的计算资源充分利用起来,但调度本身还是要消耗资源的,同时对队列做更改的操作成本应该没那么高。所以很难想象使用协程 condition_variable 等组件会什么场景下比直接的无锁队列实现要好。 不过把有界队列这样的数据结构和协程结合起来的价值应该还是有的,例如可以将有界队列封装为 AsyncGenerator,这样在取值和添加值时都可以避免阻塞,易用性也高不少。可惜目前 async_simple 还不支持 AsyncGenerator。 |
Beta Was this translation helpful? Give feedback.
-
感觉队列和协程是正交的。用户基于协程cv + 现有的各种非block队列即可实现协程阻塞式的队列。如果咱们直接实现了某一种感觉用户不一定会选择 |
Beta Was this translation helpful? Give feedback.
-
最简单的话,自己实现可以直接bounded-mpmc-queue + enqueue/dequeue 失败重试策略 + cv |
Beta Was this translation helpful? Give feedback.
-
有界队列是一个比较常用的基础组件,有必要在协程框架中提供支持,目前有三种选择:
condition_variable
和mutex
/spinlock
+stl
容器实现,这种实现的特点:读写共同竞争一把锁,实现简洁、对元素类型的限制小(允许构造过程中抛出异常)、但是性能不是很高,不适合性能敏感场景。Semaphore
+ 无锁队列,这种实现由于无锁队列本身支持线程安全的读写,Semaphore的作用主要是必要时避免轮询,而是将协程挂在Semaphore上,实现特点:采用两个Semaphore分别用于同步读和写,因此相当于读竞争一把锁、写竞争一把锁,性能可能会比第一种高,但是对元素类型有限制(基本上无锁队列都会要求元素类型的构造是noexcept的),而且由于Semaphore本身的同步开销相比于无锁队列的cas开销要大(纯猜测,欢迎纠正。比如folly的实现,即使同步操作不导致挂起协程,也要创建一个新的Lazy并且有一些额外的原子操作),我的疑问是Semaphore本身的同步开销是否导致无锁队列的性能优势被抹平了,即这种实现相比于第一种是否有必要。我个人的建议是使用1+3分别应对性能敏感和性能不敏感场景。我想知道本库将会考虑哪种实现策略。
Beta Was this translation helpful? Give feedback.
All reactions