如何实现golang select语句?

mat*_*ots 7 c++ multithreading go

特别是,我在C++中有一些阻塞队列,我想等到其中任何一个都有一些我可以弹出的项目.

我能想到的唯一机制是为每个从其输入队列弹出的队列生成一个单独的线程,并将其提供给原始线程可以等待的主队列.

生成N个新线程然后每次想要从一组队列弹出时都杀掉所有线程似乎有点资源.

Golang是否实现了一些我可以在自己的C++代码中实现的更优雅的机制?

Dim*_*rov 5

我不一定会说Go的select实现是优雅的,但我认为它以自己的方式很漂亮并且相当优化.

  • 它特殊处理selects与一个非默认情况
  • 它会对评估案例的顺序进行置换,以避免确定性饥饿
  • 它对寻找已经满足的案例的情况进行了乐观的第一次传递
  • 它使用许多内部的每个通道的内部发送器/接收器队列排队,只有运行时机制才知道
    • 它使用sudogs,就像轻量级的goroutine引用(可以有很多sudogs用于相同的goroutine),允许快速跳进goroutine堆栈
    • 它使用调度程序的gopark机制来阻止自身,从而允许对信号进行有效的解除停放
    • 当发信号和取消停放时,它会立即通过操作selectgoroutine的程序计数器进入触发的案例处理函数

在实施过程中没有单一的总体突破性想法,但您真的很感激每个步骤都经过精心修改,以便快速,高效并与渠道概念完美结合.因此,select用另一种语言重新实现Go的语句并不是很容易,除非你至少先拥有该chan结构.

您可以查看其他语言中可用的重新实现,其中重新实现了不同程度的相似性和有效性.如果我不得不select用另一种语言从头开始重新实现,我可能会首先尝试一个共享的信号量,如果不能正常工作,请切换到一个较小的,一点点睡觉然后检查随机顺序战略.