goroutines 和 boost.fiber 之间的区别



我刚刚开始研究go以及go中的并发性是如何工作的。我只是想知道你是否可以在C++中实现相同的东西,并找到了boost.fiber。goroutines和boost光纤有什么区别?你能在C++中实现一些像这些纤维一样的东西吗?

因此,从我从 boost.fiber 库的源代码中收集到的信息来看,它似乎确实比 goroutines 更通用、更强大。goroutines 的口头禅是不在协程之间共享数据,而是在必要时将数据传递到它们中。这显然在光纤中以及通道(boost::fibers::unbounded_channel<T>boost::fibers::bounded_channel<T>)中也是可能的,尽管我要记住的一件事是数据在单个线程中的所有光纤之间安全地共享。这是管理的(我猜是通过使用互斥体),以确保一次只运行一条光纤,因此您可能不需要特定用例的通道。

纤维

似乎还可以让你控制线内纤维的同步。显然,阻塞的 I/O 将阻塞运行操作的光纤所在的整个线程,这是有道理的。更酷的是,如果需要,您可以使用 Fiber 来模拟阻塞(例如,用于常规调度的严格顺序)。这里还有一个基于优先级队列的光纤自定义调度 https://github.com/olk/boost-fiber/blob/master/examples/priority.cpp 很好的例子。但是,我敢打赌,调度默认为交错它们

因此,总而言之,

似乎要带走的要点是,是的,Fibers已经实现了类似goroutine的东西。你有通道,你可以多线程(我相信这也可以扩展到多核乐趣),你可以在同一线程中运行异步操作(再次,我假设它们默认为在同一线程中交错调度)。光纤似乎拥有更多的上下文切换、光纤安全的共享内存,而 go 倾向于将事情限制为使用通道传递数据。

老实说,你必须像我一样浏览代码库才能看到 Fibers 还有什么,但是是的,我会说这些是一些主要的差异。

最新更新