我有一些在C++中的阻塞队列,我希望等待其中任意一个队列出现可以弹出的元素。
我所能想到的唯一机制是为每个队列生成一个单独的线程,该线程从其输入队列中弹出并提供到主队列中,原始线程可以在该队列上等待。
每次从一组队列中弹出时,生成N个新线程然后将它们全部终止,似乎会消耗大量资源。
Go语言是否实现了一些更优雅的机制,我是否能够在自己的C++代码中实现?
我有一些在C++中的阻塞队列,我希望等待其中任意一个队列出现可以弹出的元素。
我所能想到的唯一机制是为每个队列生成一个单独的线程,该线程从其输入队列中弹出并提供到主队列中,原始线程可以在该队列上等待。
每次从一组队列中弹出时,生成N个新线程然后将它们全部终止,似乎会消耗大量资源。
Go语言是否实现了一些更优雅的机制,我是否能够在自己的C++代码中实现?
我并不一定认为Go的select
实现是优雅的,但我认为它在自己的方式上很美丽,并且相当优化。
select
sudog
(同一个goroutine可能有很多个sudog
),使得快速跳转到goroutine堆栈成为可能gopark
机制阻止自身,这可以有效地在信号未解除时解除阻塞select
goroutine的程序计数器,立即进入触发的case处理程序函数在这个实现中,没有一个主要的革命性想法,但你会非常欣赏每一步都是如何被仔细调整,以便快速、高效并且与通道的概念很好地集成。因此,除非你至少先有chan
构造,否则在另一种语言中重新实现Go的select
语句并不是很容易。
你可以看看其他语言中可用的重新实现,其中这个想法以不同程度的相似性和有效性进行了重新设计。如果我必须在另一种语言中从头开始重新实现select
,我可能首先尝试使用单个共享信号量,如果不行,就切换到更粗糙、稍微休眠一下然后以随机顺序进行检查的策略。