我刚开始看看go以及go的工作原理。 我只是想知道你是否可以在C ++中实现相同的东西并找到boost.fiber。 goroutines和boost纤维有什么区别? 你能用C ++中的那些光纤实现goroutine吗?
答案 0 :(得分:12)
因此,根据我从boost.fiber库的源代码中收集到的内容,它似乎确实比goroutines更加通用和强大。 goroutines的咒语是不在协同程序之间共享数据,而是在必要时将数据传递给它们。这显然在光纤内以及通道(boost::fibers::unbounded_channel<T>
和boost::fibers::bounded_channel<T>
)中是可能的,尽管我要记住的一件事是在单个线程中的所有光纤之间安全地共享数据。这是通过管理(通过使用互斥锁)来确保一次只运行一根光纤,因此您可能不需要特定用例的通道。
光纤似乎也让你可以控制线程内的光纤同步。显然,阻塞的I / O会阻塞运行操作的光纤所在的整个线程,这是有道理的。更酷的是,如果需要,您可以使用光纤来模拟阻塞(例如,严格的例行调度顺序)。这里有一个基于优先级排队的光纤自定义调度的很好的例子https://github.com/olk/boost-fiber/blob/master/examples/priority.cpp。但是,我愿意打赌调度默认为交错它们
总而言之,看起来要拿走的主要观点是,纤维已经实现了类似goroutine的东西。你有频道,你可以多线程(我确信这也可以扩展到多核乐趣),你可以在同一个线程中运行异步操作(同样,我假设它们默认为交错调度在同一个线程中)。光纤似乎有更多,上下文切换,光纤安全共享内存,而go往往限制使用通道的数据传递。
老实说,你必须像我一样浏览代码库,看看Fibers有什么,但是我说这些是一些主要差异。