1 回答
TA贡献1893条经验 获得超10个赞
因此,从我从 boost.fiber 库的源代码中收集到的信息来看,它似乎确实比 goroutines 更加通用和强大。goroutines 的宗旨是不在协程之间共享数据,而是根据需要将数据传递给协程。这显然在光纤中以及通道(boost::fibers::unbounded_channel<T>
和boost::fibers::bounded_channel<T>
)中也是可能的,尽管我要记住的一件事是数据在单个线程中的所有光纤之间安全共享。这是管理的(通过使用互斥锁,我猜)以确保一次只运行一个光纤,因此您可能不需要特定用例的通道。
Fiber 似乎还可以让您控制线程内纤程的同步。显然,阻塞的 I/O 将阻塞运行操作的纤程所在的整个线程,这是有道理的。更酷的是,如果需要,您可以使用 Fiber 来模拟阻塞(例如,对于常规调度的严格顺序)。这里也有一个基于优先级队列的纤程自定义调度示例https://github.com/olk/boost-fiber/blob/master/examples/priority.cpp。但是,我愿意打赌调度默认为交错它们
所以总结一下,似乎要带走的要点是,是的,Fibers 已经实现了类似 goroutine 的东西。你有通道,你可以多线程(我相信这也可以扩展到多核乐趣),你可以在同一个线程中运行异步操作(同样,我假设它们默认在同一个线程中进行交错调度)。Fibers 似乎有更多、上下文切换、光纤安全的共享内存,而 go 倾向于将事物限制为使用通道传递数据。
老实说,您必须像我一样浏览代码库,才能查看 Fibers 还具有什么其他功能,但是我会说这些是一些主要差异。
- 1 回答
- 0 关注
- 222 浏览
添加回答
举报