goroutines和boost.fiber之间的区别

Exa*_*gon 6 c++ concurrency boost go goroutine

我刚开始看看go以及go的工作原理.我只是想知道你是否可以在C++中实现相同的东西并找到boost.fiber.goroutines和boost纤维有什么区别?你能用C++中的那些光纤实现goroutine吗?

Cor*_*pto 13

因此,根据我从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有什么,但是我会说这些是一些主要的差异.

  • @CorvusCrypto,请不要冒犯,但是根据你写的内容我会说你几乎没有在Go写一个工作程序所以我会建议OP实际做自己的研究. (3认同)
  • 改变它更清楚,我们正在谈论"安全"的内存共享.并且回想一下,如果没有进一步实现您自己的多个goroutine访问的安全内存池,您可以获得竞争条件.Boost :: Fiber已经解决了这个问题.当然,我没有冒犯,这是讨论这样的事情的重点. (2认同)