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